Distinct in LEFT JOIN | SQL & MySQL

Topic: Pubblico - Composto da 7 Posts di 2 Utenti.

16 Novembre, 2011 12:33 #1
piratolo
Utente

piratolo
Registrato: Nov, 2011
Posts: 11
Offline

Ciao,
sono alle prime armi con SQl quindi siate pazienti :)
Vi spiego il mio problema.
Ho due tabelle: nella prima ci sono le parti del corpo (dorso, addome, gambe) e nella seconda i muscoli di ogni parte, quindi è una relazione uno a molti.
Devo tirare fuori tutte le sezioni e i relativi muscoli. Per questo ho fatto una left join.
Ora però dovrei fare una distinct, in modo da ottenere una sola volta la SEZIONE con i relativi muscoli.

Adesso quello che ottengo è questo:
dorso - trapezio
dorso - rombo
dorso - lombari

io invece vorrei questo
dorso - trapezio, rombo, lombari

Avevo fatto una query di questo tipo, ma non capisoc dove mettere la distinct
select * from sezione_corpo as sez_cor LEFT JOIN muscoli as mus ON sez_cor.id = mus.id order by sezione
Grazie

16 Novembre, 2011 13:44 #2
darasc
Moderatore

darasc
Registrato: Jul, 2010
Posts: 64
Offline

Ciao,

se ho capito bene ti serve una query di questo tipo:

 1select sez_cor.descrizione as sezione,GROUP_CONCAT(mus.descrizione,',') as muscolo 
 2
 3from sezione_corpo as sez_cor 
 4
 5LEFT JOIN muscoli as mus ON sez_cor.id = mus.id 
 6
 7group by sezione
 8
 9order by sezione

La funzione GROUP_CONCAT ti permette di raggruppare più campi e separarli con un separatore (nel mio caso ho messo una virgola).

Vedi se è quello che cercavi.

17 Novembre, 2011 10:10 #3
piratolo
Utente

piratolo
Registrato: Nov, 2011
Posts: 11
Offline

Grazie mille,
la query era corretta; se ti posso disturbare ulteriormente ti chiedo un'altra cosa.

Io avevo scritto che volevo questa cosa "dorso - trapezio, rombo, lombari" per spiegare la logica.

In realtà, avrei bisogno di trattare singolarmente i record "dorso", "trapezio", "rombo", "lombari".

La cosa che serviva a me (ammesso che si posso fare con l'sql e che non sia necessario gestirla da codice),è stampare a video, tramite un ciclo, il nome della sezione, esempio Dorso, poi stampare singolarmente i relativi muoscoli, e poi passare alla successiva sezione, con i successivi relativi muscoli e così via.

17 Novembre, 2011 10:41 #4
darasc
Moderatore

darasc
Registrato: Jul, 2010
Posts: 64
Offline

Il fatto è che se prendi i muscoli singolarmente come campi capiterà sicuramente che una sezione abbia più o meno muscoli rispetto ad un'altra. MySql non ti permette di avere in output righe con numero di campi diversi.
Se utilizzi la query che ti ho postato prima avrei per ogni sezione una stringa formata, ad esempio, così: "trapezio, rombo, lombari".
A livello applicativo a questo punto risulta abbastanza semplice.
Il primo campo restituito ti dà la sezione mentre per avere i muscoli basta effettuare lo split della stringa associata.
Fammi sapere se per te va bene una soluzione del genere.

17 Novembre, 2011 10:55 #5
piratolo
Utente

piratolo
Registrato: Nov, 2011
Posts: 11
Offline

Così va benissimo, volevo più che altro sapere se esisteva un sistema simile gestito proprio dalla query; in effetti non riuscivo a capire come sarebbe stato possibile gestire record di lunghezze diverse, avrei dovuto immaginarlo subito che non era possibile.
Grazie mille.

Ultima modifica 17 Novembre, 2011 10:57 di piratolo

17 Novembre, 2011 15:22 #6
piratolo
Utente

piratolo
Registrato: Nov, 2011
Posts: 11
Offline

Ciao,
ho un nuovo problema che non avevo calcolato
Insieme ai singoli muscoli "trapezio", "rombo", "lombari" ecc, dovrei ricavarmi anche l'id relativo al singolo muscolo, ed ottenere nel ciclo l'id asssociato al muscolo

17 Novembre, 2011 15:23 #7
piratolo
Utente

piratolo
Registrato: Nov, 2011
Posts: 11
Offline

Scusami, domanda idiota :D
basta fare un'altro GROUP_CONCAT sull'id del muscolo :D

Condividi su:

Loggati o Registrati per replicare