GROUP BY entfernt keine Duplikate

7

Ich habe ein Watchlist-System, das ich programmiert habe, in der Übersicht der Benutzer-Watchlist sehen sie eine Liste von Datensätzen, aber die Liste zeigt Duplikate, wenn sie in der Datenbank nur die genaue, korrekte Nummer anzeigt / p>

Ich habe GROUP BY watch.watch_id , GROUP BY rec.record_id ausprobiert, keine der Gruppen, die ich ausprobiert habe, scheint Duplikate zu entfernen. Ich bin mir nicht sicher, was ich falsch mache.

%Vor%

Die Watchlist-Tabelle sieht folgendermaßen aus:

%Vor%     
MacMac 22.08.2011, 19:10
quelle

5 Antworten

17

GROUP BY entfernt keine Duplikate. GROUP BY ermöglicht die Aggregation. Wenn Sie nur doppelte Zeilen kombinieren möchten, verwenden Sie SELECT DISTINCT.

Wenn Sie Zeilen kombinieren müssen, die in einigen Spalten doppelt vorhanden sind, verwenden Sie GROUP BY. Sie müssen jedoch angeben, was mit den anderen Spalten geschehen soll. Sie können sie entweder weglassen (indem Sie sie nicht in der SELECT-Klausel auflisten) oder aggregieren (indem Sie Funktionen wie SUM, MIN und AVG verwenden). Zum Beispiel:

%Vor%

BEARBEITEN

Das OP hat um eine Klarstellung gebeten.

Betrachte die "Ansicht" - alle Daten, die von den FROMs und JOINs und den WHEREs zusammengefügt werden - nenne das V. Es gibt zwei Dinge, die du vielleicht machen willst.

Erstens könnten Sie vollständig doppelte Zeilen haben, die Sie kombinieren möchten:

%Vor%

Dann benutze einfach DISTINCT

%Vor%

Oder Sie haben teilweise doppelte Zeilen , die Sie kombinieren möchten:

%Vor%

Diese ersten beiden Zeilen sind in gewissem Sinne "gleich", unterscheiden sich aber in einem anderen Sinn deutlich (insbesondere würden sie nicht durch SELECT DISTINCT kombiniert). Sie müssen entscheiden, wie Sie sie kombinieren. Sie könnten die Spalte c als unwichtig abtun:

%Vor%

Oder Sie könnten eine Art Aggregation für sie durchführen. Sie könnten sie addieren:

%Vor%

Sie können den kleinsten Wert auswählen:

%Vor%

Oder Sie können den Mittelwert (AVG), die Standardabweichung (STD) und eine Reihe anderer Funktionen nehmen, die eine Menge von Werten für c aufnehmen und zu einem kombinieren.

Was nicht wirklich eine Option ist, ist nichts zu tun. Wenn Sie nur die nicht gruppierten Spalten auflisten, gibt das DBMS entweder einen Fehler aus (Oracle tut das - die richtige Wahl, imo) oder wählt einen Wert mehr oder weniger zufällig aus (MySQL). Aber wie Dr. Peart sagte: "Wenn Sie sich entscheiden, sich nicht zu entscheiden, haben Sie noch eine Wahl getroffen."

    
Malvolio 22.08.2011, 19:13
quelle
3

Während SELECT DISTINCT in Ihrem Fall tatsächlich funktionieren kann, ist es wichtig zu beachten, dass das, was Sie haben, nicht funktioniert.

Sie wählen Felder aus, die sich außerhalb von GROUP BY befinden. Obwohl MySQL dies erlaubt, sind die exakten Zeilen, die es für die nicht GROUP BY -Felder zurückgibt, undefiniert.

Wenn du das mit GROUP BY machen wolltest, probiere etwas mehr wie folgt:

%Vor%     
Jason McCreary 22.08.2011 19:16
quelle
1

Ich würde niemals SELECT DISTINCT empfehlen, bei großen Datensätzen ist es sehr langsam.

Verwenden Sie Dinge wie EXISTS .

    
Dave Warner 04.08.2015 08:27
quelle
0

Sie gruppieren sich nach watch.watch_id und Sie haben zwei Ergebnisse, die unterschiedliche Überwachungs-IDs haben, also würden sie natürlich nicht gruppiert werden.

Auch von den angezeigten Ergebnissen haben sie unterschiedliche Aufzeichnungen. Das sieht nach einem perfekt gültigen erwarteten Ergebnis aus. Wenn Sie nur bestimmte Werte auswählen möchten, möchten Sie nicht GROUP, aber Sie möchten nach bestimmten Werten auswählen.

SELECT DISTINCT() ...

    
Layke 22.08.2011 19:15
quelle
0

Wenn Sie sagen, dass Ihre Watchlist-Tabelle eindeutig ist, dann hat eine (oder beide) der anderen Tabellen entweder (a) Duplikate oder (b) ist nicht eindeutig durch den Schlüssel, den Sie verwenden.

Um Duplikate in Ihren Ergebnissen zu unterdrücken, verwenden Sie entweder DISTINCT wie @Laykes sagt oder versuchen Sie

%Vor%

Es hört sich so an, als ob Sie erwarten, dass alle drei Tabellen durch ihre Schlüssel eindeutig sind. Wenn dies der Fall ist, maskieren Sie einfach ein anderes Problem mit Ihrem SQL, indem Sie versuchen, unterschiedliche Werte abzurufen.

    
transistor1 22.08.2011 19:17
quelle

Tags und Links