MySQL LEFT JOIN SELECT не выбирает все записи левой стороны?
Вопрос
Я получаю странные результаты от 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);
Таблица Dates содержит три записи, а интервалы 1 - и эта запись указывает на третью запись в Dates.
Если я выполню следующий запрос..
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?
Решение
Тебе нужно GROUP BY d.dateID
.В двух ваших случаях, s.DateID
является NULL
(LEFT JOIN
) и они объединяются вместе.
Я думаю, вы также обнаружите, что это недопустимый SQL (ANSI), потому что d.date не является частью GROUP BY
или результат агрегатной операции, и не должен быть способен быть SELECT
изд.
Другие советы
Я думаю, вы имеете в виду сгруппировать по d.DateID.
Попробуйте удалить ГРУППУ По s.DateID
Идентификаторы дат для 10-12 и 10-13 сгруппированы вами.Поскольку они представляют собой 2 нулевых значения, счетчик вычисляется равным 0
Я не знаю, допустимо ли это в MySQL, но вы, вероятно, могли бы устранить эту ошибку в будущем, используя вместо этого следующий синтаксис
SELECT date, count(slotID) as slotCount
FROM Dates LEFT OUTER JOIN Slots USING (dateID)
GROUP BY (date)
Используя предложение USING, вы не получаете два DateID для отслеживания.
замените GROUP НА s.DateID на d.DateID.