[DISTINCT] SQL persone che hanno almeno un hobby[Risolto]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

[DISTINCT] SQL persone che hanno almeno un hobby[Risolto]

Messaggio da raffaele181188 »

Salve, sarà l'ora :D (e scusate per il titolo)
Ho due tabelle, "persona" e "hobby", e una terza tabella che associa una o più persone a uno o più hobby (questa tabella ha quindi, la colonna "persona" e la colonna "hobby")
Qual'è la query che mi serve per sapere tutte le persone che hanno almeno un hobby? (O, viceversa, tutti gli hobby che hanno almeno una persona appassionata)
Le query che ho provato non vanno bene perchè mi ritornano più volte la stessa persona se è associata a più hobby...
Quindi mi ritorna qualcosa tipo
Giancarlo
Raffaele
Raffaele
Raffaele
Antonio
se Raffaele è associato agli hobby "cucina", "caccia" e "pesca". A me serve
Giancarlo
Raffaele
Antonio
Ultima modifica di raffaele181188 il mar 14 lug 2009, 21:50, modificato 1 volta in totale.

Avatar utente
DavidZ
Packager
Packager
Messaggi: 111
Iscritto il: mer 9 mar 2005, 0:00
Slackware: 14.2 x86_64
Kernel: 4.4.19
Desktop: kde 4.14.21
Località: alto Vicentino

Re: MySQL persone che hanno almeno un hobby

Messaggio da DavidZ »

prova a guardarti la clausula DISTINCT dell'SQL, penso sia quello che ti serve

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: MySQL persone che hanno almeno un hobby

Messaggio da raffaele181188 »

Grzie mille :thumbright: sto vedendo anche il GROUP BY

Meskalamdug
Iper Master
Iper Master
Messaggi: 3961
Iscritto il: ven 14 mag 2004, 0:00

Re: MySQL persone che hanno almeno un hobby

Messaggio da Meskalamdug »

Dopo aver fatto per bene le tabelle hobby e persone
supponiamo in hobby
aerei
auto
farfalle :D

e persone

mario
michele
maria

select persona from persone where hobby=aerei;
e ti torna tutte le persone dal db persone che hanno
hobby aerei

L'importante è fare bene le tabelle,con questa query precisa
non dovrebbe tornare errori.

Avatar utente
Sustuso
Linux 1.x
Linux 1.x
Messaggi: 133
Iscritto il: mer 15 giu 2005, 0:00

Re: MySQL persone che hanno almeno un hobby

Messaggio da Sustuso »

Se non ho capito male dovrebbe essere

Codice: Seleziona tutto

select persona
from persone
where id_persona in (select id_persona from personahobby)
non dovrebbe servire il "distinct"

oppure

Codice: Seleziona tutto

select distinct persona 
from persone
right outer join personahobby on (persone.id_persona=personahobby.id_persona)
(qui il distinct serve)
non so quale sia la più veloce ma per esperienza direi la seconda....
di solito le query che hanno in o not in impiegano un botto per eseguirsi

Avatar utente
DavidZ
Packager
Packager
Messaggi: 111
Iscritto il: mer 9 mar 2005, 0:00
Slackware: 14.2 x86_64
Kernel: 4.4.19
Desktop: kde 4.14.21
Località: alto Vicentino

Re: MySQL persone che hanno almeno un hobby

Messaggio da DavidZ »

Sustuso ha scritto: non so quale sia la più veloce ma per esperienza direi la seconda....
di solito le query che hanno in o not in impiegano un botto per eseguirsi
Concordo pienamente io cerco sempre di evitare IN soprattutto in presenza di molti record nelle tabelle è lentissima
Sustuso ha scritto:

Codice: Seleziona tutto

select distinct persona 
from persone
right outer join personahobby on (persone.id_persona=personahobby.id_persona)
strana query IMHO credo di non aver mai usato RIGHT JOIN

personalmente avrei scritto

Codice: Seleziona tutto

select distinct persone.persona 
from personahobby
inner join persone on (persone.id_persona=personahobby.id_persona)
inner join hobby on (hobby.id_hobby=personahobby.id_hobby)
con le query scritte in questo modo il plan analyzer che uso mi da sempre ottime prestazioni e che io sappia le inner sono le più performanti

Avatar utente
Sustuso
Linux 1.x
Linux 1.x
Messaggi: 133
Iscritto il: mer 15 giu 2005, 0:00

Re: MySQL persone che hanno almeno un hobby

Messaggio da Sustuso »

DavidZ ha scritto:
strana query IMHO credo di non aver mai usato RIGHT JOIN
Ha lo stesso effetto della left solo che lavora da destra a sinistra e per questo non viene usata (di solito si scambiano le tabelle in from e left outer join) ma visto che esiste il metodo ed i nomi stanno in una sola tabella perchè ingegnarsi ad usare altro ;)

Comunque non ho trovato mai un sito completo sul linguaggio sql, quello che posso consigliare e di vedere tutte i metodi possibili e smanettarci un pò.
Si perde del tempo ma alla fine si a padroneggiare e col tempo ci si ingegna anche ad ottimizzare le chiamate per DB più grandi e complessi.

@raffaele181188
se sei alle prime armi fai anche attenzione ai nomi che dai ai campi e tabelle, è buono prendere un metodo per poi non perdere tempo a pensare se devi scrivere (ad esempio) persona o persone per la tabella, id_persona o id_persone per la chiave ecc., sembrano stupidate ma ...... si perde un botto di tempo a correggere errori del genere.

Saluti

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: MySQL persone che hanno almeno un hobby

Messaggio da raffaele181188 »

Non sono proprio alle prime armi :D
L'esempio era molto semplificato, e mi ero dimenticato di dare dei dati fondamentali, ma a quanto pare DavidZ mi ha letto nel cervello =D>
Mi serve il DISTINCT, nel database va inserito in una JOIN su tre/quattro tabelle (ora non ricordo di preciso)

Ovviamente i nomi delle tabelle sono di fantasia, e nelle JOIN uso sempre gli alias (per la cronaca, sono tabelle segrete segretissime che fra qualche tempo, spero, useremo tutti :D )

Rispondi