/ / DISTINCT che estrae valori di colonna duplicati: sql, join, distinto, inner-join

DISTINCT che tira i valori delle colonne duplicate - sql, join, distinct, inner-join

La query seguente sta eseguendo il pull di duplicati site_ids, con me usando DISTINCT non riesco a capire perché ...

SELECT
DISTINCT site_id,
deal_woot.*,
site.woot_off,
site.name AS site_name
FROM deal_woot
INNER JOIN site ON site.id = site_id
WHERE site_id IN (2, 3, 4, 5, 6)
ORDER BY deal_woot.id DESC LIMIT 5

risposte:

2 per risposta № 1

DISTINCT guarda il intero record, non solo la colonna subito dopo. Per ottenere ciò che desideri, dovrai utilizzarlo GROUP BY:

Codice non funzionante:

SELECT
site_id,
deal_woot.*,
site.woot_off,
site.name AS site_name
FROM deal_woot
INNER JOIN site ON site.id = site_id
WHERE site_id IN (2, 3, 4, 5, 6)
GROUP BY site_id

Perché non funziona? Se tu GROUP BY una colonna, dovresti usare una funzione aggregata (come MIN o MAX) sul resto delle colonne, altrimenti, se ce ne sono più site_woot_offs per un dato site_id, non è chiaro a SQL quale di questi valori tu vuoi SELECT.

Probabilmente dovrai espandere deal_woot.* per elencare ciascuno dei suoi campi.

Nota a margine: Se stai usando MySQL, credo che non sia tecnicamente necessario specificare una funzione aggregata per le colonne rimanenti. Se non specifichi una funzione aggregata per una colonna, sceglierà un valore per singola colonna (di solito il primo valore nel set di risultati).


2 per risposta № 2

La tua richiesta sta tornando DISTINCT righe, non è solo guardare site_id. In altre parole, se una delle colonne è diversa, viene restituita una nuova riga da questa query.

Questo ha senso, perché se si hanno effettivamente delle differenze, a cosa dovrebbe restituire il server come valori deal_woot.* ? Se vuoi farlo, devi specificare questo, forse fatto distinguendoti site_id"s, quindi ottenere LIMIT 1 degli altri valori in una sottoquery con un appropriato ORDER BY clausola.


0 per risposta № 3

Stai selezionando un valore distinto da una sola tabella. Quando ti unisci con l'altra tabella, verranno estratte tutte le righe che corrispondono a ciascuno dei tuoi valori distinti dall'altra tabella, causando ID duplicati


0 per risposta № 4

Se si desidera selezionare le informazioni sul sito e una singola riga dalla tabella deal_woot con lo stesso site_id, è necessario utilizzare una query diversa. Per esempio,

SELECT site.id, deal_woot.*, site.woot_off, site.name
FROM site
INNER JOIN
(SELECT site_id, MAX(id) as id FROM deal_woot
WHERE site_id IN (2,3,4,5,6) GROUP BY site_id) X
ON (X.site_id = site.id)
INNER JOIN deal_woot ON (deal_woot.id = X.id)
WHERE site.id IN (2,3,4,5,6);

Questa query dovrebbe funzionare indipendentemente dal dialetto sql / fornitore db. Per mysql, puoi semplicemente aggiungere group by site_id alla query originale, poiché ti consente di utilizzare GROUP BY senza funzioni aggregate.
** Presumo che deal_woot.id e site.id sono le chiavi primarie per deal_woot e site tabelle rispettivamente.