Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    776

    [MySql] estrapolare dati da più tabelle in una sola sentenza, relazione molti a molti

    Ciao a tutti,


    È possibile con una sola sentenza estrapolare tutti i dati della tabellla Clienti con, in un campo il nome del cliente, in un altro campo tutte le etichette appartenenti a quel cliente separate da una virgola?


    date 3 tabelle, clienti, etichette, clienti_etichette:
    ----------
    Clienti(tabella)
    id_cliente(PK)
    nomeCliente
    -----------
    Etichette(tabella)
    id_etichetta(PK)
    nomeEtichetta
    ------------
    Clienti_Etichette(tabella)
    id_cliente_etichetta(PK)
    id_cliente(FK tabella Clienti)
    id_etichetta(FK tabella Etichette)
    --------------


    La tabella Clienti_Etichette contiene le relazioni tra le due tabelle Clienti e Etichette, la relazione è molti a molti, ovvero ad un campo di Clienti possono corrispondere più campi della tabella Etichette e una etichetta può essere in relazione con più campi della tabella Clienti.


    Attualmente faccio 2 select in due comandi separati:
    la prima mi va ad estrapolare tutti i campi della tabella etichette e con il risultato totale, poi , con il risultato utilizzando PHP, riga per riga estrapolo id_cliente, vado vedere in quali campi è contenuto nella tabella Clienti_Etichette e con l'id_etichetta estrapolo il nome della etichetta dalla tabella Etichette.


    le select sono queste:
    Prima select:
    select * from Clienti
    Seconda select:
    select Etichette.nome_etichetta from Etichette,Clienti_Etichette where Clienti_Etichette.id_etichetta = Etichette.id_etichetta and Clienti_Etichette.id_Cliente=:id ( :id viene sostituito per ogni riga ricavata dalla prima select)


    Lo sto facendo correttamente o potrei fare la stessa cosa in un'unica sentenza?



    Grazie,
    Roberto

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da robynosse Visualizza il messaggio
    .... chette.id_Cliente=:id
    Non conosco MySql a sufficienza, ma si altri db io farei cosi:
    codice:
    .... chette.id_Cliente=(...Iltesto della tua query che da come risultato il tuo id... ;)

    pero la tua prima select mi sembra strana!!

    Facci sapere
    Ultima modifica di nman; 20-10-2014 a 12:51

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    776
    Quote Originariamente inviata da nman Visualizza il messaggio
    Non conosco MySql a sufficienza, ma si altri db io farei cosi:
    codice:
    .... chette.id_Cliente=(...Iltesto della tua query che da come risultato il tuo id... ;)

    pero la tua prima select mi sembra strana!!

    Facci sapere
    Ciao, grazie per la risposta!

    Sì, forse mi sono spiegato male!

    Con la prima select ottengo un risultato, immaginiamo 3 record un array con 2 campi:
    select * from Clienti
    ----------------------
    id_cliente=0
    nomeCliente=pippo
    ----------------------
    id_cliente=1
    nomeCliente=pluto
    ----------------------
    id_cliente=2
    nomeCliente=paperino
    ----------------------

    con la seconda select, con PHP, per ogni record del risultato faccio un'altra select
    select Etichette.nome_etichetta from Etichette,Clienti_Etichette where Clienti_Etichette.id_etichetta = Etichette.id_etichetta and Clienti_Etichette.id_Cliente=:id ( dove :id viene sostituito per ogni riga ricavata dalla prima select)
    Le tre select risultanti saranno
    select Etichette.nome_etichetta from Etichette,Clienti_Etichette where Clienti_Etichette.id_etichetta = Etichette.id_etichetta and Clienti_Etichette.id_Cliente='0'
    select Etichette.nome_etichetta from Etichette,Clienti_Etichette where Clienti_Etichette.id_etichetta = Etichette.id_etichetta and Clienti_Etichette.id_Cliente='1'
    select Etichette.nome_etichetta from Etichette,Clienti_Etichette where Clienti_Etichette.id_etichetta = Etichette.id_etichetta and Clienti_Etichette.id_Cliente='2'
    Dal risultato sopra(select * from Clienti)ad ogni select, sempre con php, associo i campi etichetta

    Il mio risultato è un array con 3 campi dove nei primi 2 ci saranno i campi della prima select e nel terzo il nome delle etichette separate da una virgola:

    ----------------------
    id_cliente=0
    nomeCliente=pippo
    etichette=etichettaA,etichettaB,etichettaR
    ----------------------
    La domanda è, posso fare tutto con una sola select?
    Ad esempio creare un alias di una colonna, dove mettere i nomi delle etichette separate da una virgola, senza dover utilizzare un linguaggio che non sia SQL?

    Grazie,
    Roberto

  4. #4
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    forse non ho capito, ma se devi concatenare un campo di N record in uno solo puoi usare GROUP_CONCAT di MySQL

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    776
    Grazie, proverò a dargli un'occhiata!

    Roberto

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Per concatenare i campi hai già avuto indicazioni...

    Per quanto riguarda l'utilizzo di una sola istanza per avere tutte le etichette di un cliente avendone il nome basta:
    codice:
    SELECT Etichette.nome_etichetta 
    FROM Clienti_Etichette 
    WHERE Clienti_Etichette.id_cliente = (SELECT id_cliente 
                                                  FROM Clienti 
                                                  WHERE nomeCliente= 'TuoNomeCliente')

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.