MySQL LEFT JOIN SELECT не выбирает все записи левой стороны?

StackOverflow https://stackoverflow.com/questions/205340

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top