#mysql #sql
Вопрос:
У меня есть инструкция SQL, которая запрашивает данные из базы данных.
SELECT `ID`, `To`, `Poster`, `Content`, `Time`, ifnull(`Aura`,0) as `Aura` FROM (
SELECT * FROM (
SELECT DISTINCT * FROM messages m
INNER JOIN
(
SELECT Friend2 as Friend FROM friends WHERE Friend1 = '1'
UNION ALL
SELECT Friend1 as Friend FROM friends WHERE Friend2 = '1'
) friends ON m.Poster = friends.`Friend`
UNION ALL SELECT DISTINCT *, '1' FROM messages where `Poster`='1'
) var
LEFT JOIN
(
select `ID` as `AuraID`, `Status` as `AuraStatus`, count(*) as `Aura`
from messages_aura
) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus)
) final
GROUP BY `ID`, `Poster`
ORDER BY `Time` DESC LIMIT 10
Вот мой messages_aura
макет стола. Это показывает ID
, Status
и UserID
.
Вот вывод из приведенного выше утверждения.
( ID
На Poster
скриншоте выше указано ниже, а Status
на скриншоте выше указано ID
ниже)
Оператор должен указывать в нижней строке количество Аур 1
, а в верхней строке-количество Аур 2
. Что случилось?
Комментарии:
1. Вам нужно
GROUP BY
в подзапросе, не так ли?2. Ты прав! Спасибо, я не могу поверить, что это было так просто xD
3. Я не могу поверить, что эта проблема так распространена. Вероятно, нам придется публиковать такие ответы несколько раз в день.
4. Расширенная поддержка MySQL group by (IMO) является самой большой проблемой для большинства разработчиков, использующих агрегаты и mysql. Эта расширенная поддержка вызывает проблемы у большинства людей. Я думаю, что нам было бы лучше, если бы эта функция была отключена по умолчанию. База данных скрывает то, что было бы стандартной ошибкой SQL ANSII, имея агрегат без группы.
Ответ №1:
Вы отсутствуете GROUP BY
, поэтому он подсчитывает все, а не группирует по некоторым столбцам.
LEFT JOIN
(
select `ID` as `AuraID`, `Status` as `AuraStatus`, count(*) as `Aura`
from messages_aura
GROUP BY AuraID, AuraStatus
) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus)