SQL подсчитывает все строки вместо подсчета отдельных строк

#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)