Repository 32bit  Forum
Repository 64bit  Wiki

[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.

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

Messaggioda raffaele181188 » mar lug 14, 2009 0:14

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 lug 14, 2009 20:50, modificato 1 volta in totale.
Avatar utente
raffaele181188
Packager
Packager
 
Messaggi: 789
Iscritto il: ven set 07, 2007 20:40
Località: DearSkin (FG)
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu

Re: MySQL persone che hanno almeno un hobby

Messaggioda DavidZ » mar lug 14, 2009 0:24

prova a guardarti la clausula DISTINCT dell'SQL, penso sia quello che ti serve
Avatar utente
DavidZ
Packager
Packager
 
Messaggi: 108
Iscritto il: mer mar 09, 2005 0:00
Località: alto Vicentino
Slackware: 14.0 x86_64
Kernel: 3.2.29
Desktop: kde 4.8.5

Re: MySQL persone che hanno almeno un hobby

Messaggioda raffaele181188 » mar lug 14, 2009 6:21

Grzie mille :thumbright: sto vedendo anche il GROUP BY
Avatar utente
raffaele181188
Packager
Packager
 
Messaggi: 789
Iscritto il: ven set 07, 2007 20:40
Località: DearSkin (FG)
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu

Re: MySQL persone che hanno almeno un hobby

Messaggioda Meskalamdug » mar lug 14, 2009 7:20

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.
Meskalamdug
Iper Master
Iper Master
 
Messaggi: 3586
Iscritto il: gio mag 13, 2004 23:00

Re: MySQL persone che hanno almeno un hobby

Messaggioda Sustuso » mar lug 14, 2009 8:43

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
Sustuso
Linux 2.0
Linux 2.0
 
Messaggi: 133
Iscritto il: mar giu 14, 2005 23:00

Re: MySQL persone che hanno almeno un hobby

Messaggioda DavidZ » mar lug 14, 2009 9:18

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
DavidZ
Packager
Packager
 
Messaggi: 108
Iscritto il: mer mar 09, 2005 0:00
Località: alto Vicentino
Slackware: 14.0 x86_64
Kernel: 3.2.29
Desktop: kde 4.8.5

Re: MySQL persone che hanno almeno un hobby

Messaggioda Sustuso » mar lug 14, 2009 16:22

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
Sustuso
Linux 2.0
Linux 2.0
 
Messaggi: 133
Iscritto il: mar giu 14, 2005 23:00

Re: MySQL persone che hanno almeno un hobby

Messaggioda raffaele181188 » mar lug 14, 2009 20:50

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 )
Avatar utente
raffaele181188
Packager
Packager
 
Messaggi: 789
Iscritto il: ven set 07, 2007 20:40
Località: DearSkin (FG)
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite