MySQL LEFT JOIN SELECT не выбирает все записи левой стороны? - PullRequest
1 голос
/ 15 октября 2008

Я получаю странные результаты от запроса 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?

Ответы [ 6 ]

6 голосов
/ 15 октября 2008

Вам нужно GROUP BY d.dateID. В двух ваших случаях s.DateID равно NULL (LEFT JOIN), и они объединены вместе.

Я думаю, вы также обнаружите, что это недопустимый (ANSI) SQL, потому что d.date не является частью GROUP BY или результатом агрегированной операции и не может быть SELECT ed.

2 голосов
/ 15 октября 2008

Я думаю, что вы хотите группировать по d.dateId.

1 голос
/ 15 октября 2008

Я не знаю, допустимо ли это в MySQL, но вы могли бы, вероятно, исправить эту ошибку в будущем, используя вместо этого следующий синтаксис

SELECT date, count(slotID) as slotCount
FROM Dates LEFT OUTER JOIN Slots USING (dateID)
GROUP BY (date)

Используя предложение USING, вы не получаете два dateID для отслеживания.

1 голос
/ 15 октября 2008

Dateid для 10-12 и 10-13 сгруппированы вами. Так как они являются 2 нулевыми значениями, счет считается равным 0

1 голос
/ 15 октября 2008

Попробуйте удалить GROUP BY s.dateID

0 голосов
/ 15 октября 2008

заменить GROUP BY s.dateID на d.dateID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...