Справка по SQL: агрегат COUNT, список записей и количество комментариев - PullRequest
0 голосов
/ 21 июля 2009

Итак, что я намеревался сделать, это получить список записей / сообщений с их категорией и пользовательскими данными, И каждый из его общих опубликованных комментариев. (записи, категории, пользователи и комментарии - это отдельные таблицы)

Этот запрос ниже выбирает записи в порядке, но, кажется, пропускает эти записи без комментариев. Насколько я вижу, JOIN хороши (LEFT JOIN в таблице комментариев), и запрос правильный. Что я пропустил?

SELECT entries.entry_id, entries.title, entries.content,
entries.preview_image, entries.preview_thumbnail, entries.slug,
entries.view_count, entries.posted_on, entry_categories.title AS category_title,
entry_categories.slug AS category_slug, entry_categories.parent AS category_parent,
entry_categories.can_comment AS can_comment, entry_categories.can_rate AS can_rate,
users.user_id, users.group_id, users.username, users.first_name, users.last_name,
users.avatar_small, users.avatar_big, users.score AS user_score, 
COUNT(entry_comments.comment_id) AS comment_count

FROM (entries)
JOIN entry_categories ON entries.category = entry_categories.category_id
JOIN users ON entries.user_id = users.user_id
LEFT JOIN entry_comments ON entries.entry_id = entry_comments.entry_id

WHERE `entries`.`publish` = 'Y'
AND `entry_comments`.`publish` = 'Y'
AND `entry_comments`.`deleted_at` IS NULL
AND `category` = 5

GROUP BY entries.entry_id, entries.title, entries.content,
entries.preview_image, entries.preview_thumbnail, entries.slug,
entries.view_count, entries.posted_on, category_title, category_slug,
category_parent, can_comment, can_rate, users.user_id, users.group_id,
users.username, users.first_name, users.last_name, users.avatar_big,
users.avatar_small, user_score

ORDER BY posted_on desc

edit: я использую MySQL 5.0

Ответы [ 3 ]

1 голос
/ 21 июля 2009

Ну, вы делаете левое соединение для entry_comments с условиями:

`entry_comments`.`publish` = 'Y'
`entry_comments`.`deleted_at` IS NULL

Для записей без комментариев эти условия ложны. Я думаю, это должно решить проблему:

WHERE `entries`.`publish` = 'Y'
AND (
        (`entry_comments`.`publish` = 'Y'
        AND `entry_comments`.`deleted_at` IS NULL)
    OR
        `entry_comments`.`id` IS NULL
    )
AND `category` = 5

В условии OR я помещаю entry_comments. id, предполагая, что это первичный ключ таблицы entry_comments, поэтому вы должны заменить его реальным первичным ключом entry_comments.

1 голос
/ 21 июля 2009

Это потому, что вы устанавливаете фильтр для столбцов в таблице entry_comments. Заменить первое на:

AND IFNULL(`entry_comments`.`publish`, 'Y') = 'Y'

Поскольку ваш второй фильтр в этой таблице - IS NULL, это все, что вам нужно сделать, чтобы пропустить несопоставленные строки из LEFT JOIN через.

0 голосов
/ 21 июля 2009

Попробуйте изменить левое соединение на левое внешнее соединение

OR

Я не являюсь экспертом в этом стиле объединений SQL (больше я сам являюсь человеком Oracle), но формулировка левого объединения наводит меня на мысль, что это присоединение entry_comments к записям с entry_comments слева очень хочу, чтобы все было наоборот (я думаю).

Так что попробуйте что-то вроде:

ЛЕВЫЕ ВНУТРЕННИЕ СОЕДИНИТЕЛЬНЫЕ ЗАПИСИ НА entry.entry_id = entry_comments.entry_id

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