MySQL LEFT JOIN Auswahl SELECT nicht alle linken Seite Aufzeichnungen?
Frage
Ich bin immer ungeradee Ergebnisse einer MySQL SELECT
Abfrage eine LEFT JOIN
beteiligt, und ich kann nicht verstehen, ob mein Verständnis von LEFT JOIN
falsch ist oder ob ich ein wirklich seltsames Verhalten zu sehen bin.
Ich habe eine zwei Tabellen mit einer Viele-zu-Eins-Beziehung: Für jeden Datensatz in table 1
gibt es 0 oder mehr Datensätze in table 2
. Ich möchte alle Datensätze in der Tabelle, um 1 mit einer Spalte, die die Anzahl von Bezugsdatensätzen in der Tabelle zählt 2. Wie ich es verstehe, LEFT JOIN
sollte immer alle Datensätze zurück auf der LEFT
Seite der Aussage.
Hier ist eine Testdatenbank, die das Problem zeigt:
CREATE DATABASE Test;
USE Test;
CREATE TABLE Dates (
dateID INT UNSIGNED NOT NULL AUTO_INCREMENT,
date DATE NOT NULL,
UNIQUE KEY (dateID)
) TYPE=MyISAM;
CREATE TABLE Slots (
slotID INT UNSIGNED NOT NULL AUTO_INCREMENT,
dateID INT UNSIGNED NOT NULL,
UNIQUE KEY (slotID)
) TYPE=MyISAM;
INSERT INTO Dates (date) VALUES ('2008-10-12'),('2008-10-13'),('2008-10-14');
INSERT INTO Slots (dateID) VALUES (3);
Die Daten Tabelle hat drei Datensätze, und die Slots 1 - und dass die Aufzeichnungspunkte auf den dritten Datensatz in Daten
.Wenn ich die folgende Abfrage ..
SELECT d.date, count(s.slotID) FROM Dates AS d LEFT JOIN Slots AS s ON s.dateID=d.dateID GROUP BY s.dateID;
.. Ich erwarte, dass eine Tabelle mit drei Zeilen zu sehen - zwei mit einer Zählung von 0, und eines mit einer Zählung von 1. Aber was ich tatsächlich sehen, ist dies:
+------------+-----------------+
| date | count(s.slotID) |
+------------+-----------------+
| 2008-10-12 | 0 |
| 2008-10-14 | 1 |
+------------+-----------------+
Der erste Datensatz mit einer Nullzählung erscheint, aber die spätere Aufzeichnung mit einer Null-Zählung wird ignoriert.
Mache ich etwas falsch, oder ich verstehe einfach nicht, was soll LEFT JOIN ist tun?
Lösung
Sie müssen GROUP BY d.dateID
. In zwei Ihrer Fällen s.DateID
ist NULL
(LEFT JOIN
) und diese miteinander kombiniert werden.
Ich glaube, Sie werden auch feststellen, dass diese ungültig (ANSI) SQL ist, weil d.date nicht Teil eines GROUP BY
oder das Ergebnis eines Aggregats Betrieb ist, und sollte nicht in der Lage sein SELECT
ed werden.
Andere Tipps
Ich glaube, Sie zu einer Gruppe von d.dateId bedeuten.
Versuchen Sie, die GROUP BY s.dateID Entfernen
Das Datum für 10-12 und 10-13 sind durch Sie gruppiert. Da sie zwei Nullwerte sind, wird der Zähler auf 0 ausgewertet
Ich weiß nicht, ob dies in MySQL gültig ist, aber Sie könnten wahrscheinlich diesen Fehler in Zukunft ungültig, indem Sie die folgende Syntax, anstatt mit
SELECT date, count(slotID) as slotCount
FROM Dates LEFT OUTER JOIN Slots USING (dateID)
GROUP BY (date)
Durch die USING-Klausel bekommt man nicht zwei dateID die den Überblick behalten.
ersetzen GROUP BY s.dateID mit d.dateID.