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?

War es hilfreich?

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 SELECTed 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top