Я получаю странные результаты от запроса MySQL SELECT
, включающего LEFT JOIN
, и я не могу понять, неверно ли мое понимание LEFT JOIN
или я вижу действительно странное поведение.
У меня есть две таблицы с отношением "многие к одному": для каждой записи в table 1
есть 0 или более записей в table 2
. Я хочу выбрать все записи в таблице 1 со столбцом, который подсчитывает количество связанных записей в таблице 2. Как я понимаю, LEFT JOIN
всегда должен возвращать все записи на стороне LEFT
оператора.
Вот тестовая база данных, в которой обнаружена проблема:
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);
Таблица дат имеет три записи, и слоты 1 - и эта запись указывает на третью запись в датах.
Если я сделаю следующий запрос ..
SELECT d.date, count(s.slotID) FROM Dates AS d LEFT JOIN Slots AS s ON s.dateID=d.dateID GROUP BY s.dateID;
.. Я ожидаю увидеть таблицу с 3 строками - две со счетом 0 и одну со счетом 1. Но на самом деле я вижу это:
+------------+-----------------+
| date | count(s.slotID) |
+------------+-----------------+
| 2008-10-12 | 0 |
| 2008-10-14 | 1 |
+------------+-----------------+
Появляется первая запись с нулевым счетом, но более поздняя запись с нулевым счетом игнорируется.
Я что-то не так делаю или просто не понимаю, что должен делать LEFT JOIN?