Чей глюк?

Тема в разделе "SQL", создана пользователем Sinful, 31 июл 2006.

Статус темы:
Закрыта.
  1. Sinful

    Sinful Гость

    Уже 2 раз наталкиваюсь на глюк и немогу понять толи я просто неправельно запрос состовляю толи это бд глючит. Для примера простенький запрос

    SELECT forum.*,
    COUNT(m.messageId) count_message
    FROM forum LEFT JOIN forum_messages m ON forum.forumId = m.forumId
    WHERE 1
    GROUP BY (m.forumId)

    выбираем из таблице forum все данные и считаем количество сообщений для каждого. Вроде все классно, но если есть форумы в которых нет сообщенией т.е. count_message будет равен 0 то вернется только 1 форум с count_message = 0, их таких может быть хоть 10 но возвращает только 1. Я бы понял если бы база вобще не вернула значений с count_message = 0. Меня это вводит в полнейший транс, если кто знает в чем ошибка просветитя меня.
    P.S. бд MySql 5.0.18
     
  2. Sinful

    Sinful Гость

    Да чуть не забыл не стоит писать как это можно сделать подругому. Это и так понятно интересно почуму этот вариант не работает
     
  3. Burunduk-13

    Burunduk-13 Гость

    > GROUP BY (m.forumId)
    если нету сообщений, то m.forumId будет NULL. для ЛЮЫХ форумов, где нет сообщений. Поэтому и группировка такая.

    простейшее решение - написать GROUP BY (forum.forumId). Должно группировать действительно по форумам.
     
  4. Sinful

    Sinful Гость

    Спасибо так действительно проще чем сделал я.
    Но я так и не понял почему база возвращает все таки 1 запись с 0. Когда " m.forumId будет NULL. для ЛЮЫХ форумов, где нет сообщений".
     
  5. Burunduk-13

    Burunduk-13 Гость

    > Но я так и не понял почему база возвращает все таки 1 запись с 0. Когда " m.forumId будет NULL. для ЛЮЫХ форумов, где нет сообщений".

    1. Идет группировка по m.forumId. Для этих форумов m.forumId всегда будет равно NULL. Поэтому все такие форумы группируются в одну запись.
    2. COUNT(m.messageId) считает кол-во не-NULL элементов. Но, в нашем случае, все ИД сообщений (для форумов без сообщений) будут NULL, поэтому и возвращает 0.
     
  6. Sinful

    Sinful Гость

    Спасибо теперь наконец то догнал, теперь смогу спать спокойно:(
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей