PDA

View Full Version : [SQL] Aiuto Query


_TeRmInEt_
10-05-2008, 20:03
Ho un problema con una query...

Campi:
s_id (Chiave primaria)
s_mid
s_date
s_message
s_ip

Voglio semplicemente vedere se uno o più ip (s_ip) sono associati a più utenti (s_mid), quindi controllare se più utenti condividono lo stesso ip

DBMS: Mysql 5.0

Grazie :)

tæo
10-05-2008, 20:35
SELECT s_ip FROM your_table GROUP BY s_ip HAVING COUNT(s_ip)>1

_TeRmInEt_
10-05-2008, 21:01
SELECT s_ip FROM your_table GROUP BY s_ip HAVING COUNT(s_ip)>1


Grazie, ma purtroppo non va bene così... questa mi dovrebbe mostrare in output tutti i record maggiori di 1 presenti.

Io voglio che mi venga mostrato se un s_ip è associato a più s_mid.

Ciao

tæo
10-05-2008, 21:14
ho dato per scontato che nella tua tabella le coppie (s_ip, s_mid) fossero univoche, invece dalla tua risposta mi sembra di capire che possono esistere più record con uguale utente e ip e quindi un semplice controllo sulla cardinalità dei gruppi di s_ip non funzionerebbe dato che considererebbe anche quelli con lo stesso s_mid.

alla luce di questo potrsti usare la seguente (scarsamente efficiente):


SELECT x.s_ip FROM your_table x WHERE x.s_mid IN (
SELECT y.s_mid FROM your_table y WHERE x.s_ip=y.s_ip AND x.s_mid<>y.s_mid
)

oppure equivalentemente

SELECT x.s_ip FROM your_table x JOIN your_table y ON x.s_ip=y.s_ip WHERE x.s_mid<>y.s_mid

_TeRmInEt_
10-05-2008, 22:22
ho dato per scontato che nella tua tabella le coppie (s_ip, s_mid) fossero univoche, invece dalla tua risposta mi sembra di capire che possono esistere più record con uguale utente e ip e quindi un semplice controllo sulla cardinalità dei gruppi di s_ip non funzionerebbe dato che considererebbe anche quelli con lo stesso s_mid.

alla luce di questo potrsti usare la seguente (scarsamente efficiente):


SELECT x.s_ip FROM your_table x WHERE x.s_mid IN (
SELECT y.s_mid FROM your_table y WHERE x.s_ip=y.s_ip AND x.s_mid<>y.s_mid
)

oppure equivalentemente

SELECT x.s_ip FROM your_table x JOIN your_table y ON x.s_ip=y.s_ip WHERE x.s_mid<>y.s_mid


Forse funziona, il problema è che mi da una sfilza di record duplicati (una serie di infiniti ip uguali), forse devo aggiungere un GROUP BY ?

Grazie

tæo
10-05-2008, 22:49
scusa, errore mio. aggiungi un DISTINCT dopo la prima SELECT, i.e.


SELECT DISTINCT x.s_ip FROM your_table x JOIN your_table y ON x.s_ip=y.s_ip WHERE x.s_mid<>y.s_mid

gugoXX
11-05-2008, 01:05
Alcuni dialetti SQL permettono la seguente


SELECT s_ip FROM your_table GROUP BY s_ip HAVING COUNT(DISTINCT s_mid)>1

_TeRmInEt_
11-05-2008, 07:41
Perfetto grazie ;)