2009-10-09 16 views
5

sto facendo una selezione in MySQL con una INNER JOIN:Nessun duplicati in query SQL

SELECT DISTINCT tblcaritem.caritemid, tblcar.icarid 
FROM tblcaritem 
INNER JOIN tblprivatecar ON tblcaritem.partid = tblprivatecar.partid 
INNER JOIN tblcar ON tblcaritem.carid = tblcar.carid 
WHERE tblcaritem.userid=72; 

A volte ricevo duplicati di tblcaritem.caritemid nel risultato. Voglio essere sicuro di non ottenere mai duplicati di tblcaritem.caritemid, ma come posso farlo? Ho provato a usare DISTINCT ma ho appena controllato se l'intera riga è un duplicato, voglio controllare solo per tblcaritem.caritemid, c'è un modo?

Scusate se non l'ho spiegato molto bene, non sono la migliore delle query SQL.

+1

Se hai icardidi diversi per lo stesso caritemid, cosa vuoi dhow? cioè quale icarid – Mark

+0

Cosa si intende utilizzando il prefisso tbl per un tavolo? Hai avuto bisogno di leggere il prefisso di tblcar per identificarlo come un tavolo di macchine? – Rodrigo

+0

Potresti per favore pubblicare la struttura dei tuoi tavoli? – Quassnoi

risposta

11

GROUP BY tblcaritem.caritemid

+1

Devo essere stato davvero stanco, perché non l'ho fatto? Funziona ora grazie! :-) – Martin

0

Se mettete 2 campi in una query SELECT DISTINCT, si tornerà righe in cui la combinazione di dei 2 campi è unico, non solo dove ogni campo è unico.

È necessario eseguire 2 query separate se si desidera ottenere solo risultati univoci per ogni colonna.

4

Il problema qui è proprio come lei: si sta controllando per l'unicità di tutta la fila, il set di dati finisce per assomigliare a questo:

CarItemId CarId 
--------- ----- 
1   1 
1   2 
1   3 
2   1 
2   2 
3   3 

Volete CarItemIds unici con duplicati, il che significa che vuoi anche CarIs unici ---- va bene, hai 3 CarId, quale dovrebbe scegliere SQL Server?

Non avete molta scelta qui tranne per aggregare quelle CarIds in più lontano:

SELECT tblcaritem.caritemid, max(tblcar.icarid) 
FROM tblcaritem 
INNER JOIN tblprivatecar ON tblcaritem.partid = tblprivatecar.partid 
INNER JOIN tblcar ON tblcaritem.carid = tblcar.carid 
WHERE tblcaritem.userid=72 
GROUP BY tblcaritem.caritemid 
0

si potrebbe fare una funzione di aggregazione d'altra fila ... qualcosa come max o min

SELECT tblcaritem.caritemid, max(tblcar.icarid) 
FROM tblcaritem 
INNER JOIN tblprivatecar ON tblcaritem.partid = tblprivatecar.partid 
INNER JOIN tblcar ON tblcaritem.carid = tblcar.carid 
WHERE tblcaritem.userid=72 
group by tblcaritem.caritemid;