Как подсчитать другую таблицу в левом соединении - PullRequest
3 голосов
/ 02 июня 2010

У меня есть несколько таблиц

post
    id  Name
    1   post-name1
    2   post-name2

user
    id  username
    1   user1
    2   user2

post_user
    post_id   user_id
    1         1
    2         1

post_comments
    post_id   comment_id
    1         1
    1         2
    1         3

Я использую запрос, подобный этому:

SELECT post.id, post.title, user.id AS uid, username
FROM `post`
LEFT JOIN post_user ON post.id = post_user.post_id
LEFT JOIN user ON user.id = post_user.user_id
ORDER BY post_date DESC

Работает как задумано. Однако я хотел бы получить количество комментариев для каждого поста тоже. Так, как я могу изменить этот запрос, чтобы я мог получить количество комментариев.

Есть идеи?

Ответы [ 2 ]

15 голосов
/ 02 июня 2010
SELECT post.id, post.title, user.id AS uid, username, COALESCE(x.cnt,0) AS comment_count
FROM `post`
LEFT JOIN post_user ON post.id = post_user.post_id
LEFT JOIN user ON user.id = post_user.user_id
LEFT OUTER JOIN (SELECT post_id, count(*) cnt FROM post_comments GROUP BY post_id) x ON post.id = x.post_id
ORDER BY post_date DESC

РЕДАКТИРОВАТЬ: сделал его внешним соединением, если нет комментариев

РЕДАКТИРОВАТЬ2: Изменил IsNull на Coalesce

1 голос
/ 02 июня 2010

Эта отредактированная версия показывает строки без комментариев:

SELECT post.id, post.title, user.id AS uid, username, count(post_comments.comment_id) as comment_count
FROM `post`
LEFT JOIN post_user ON post.id = post_user.post_id
LEFT JOIN user ON user.id = post_user.user_id
LEFT JOIN post_comments ON post_comments.post_id = post.id
GROUP BY post.id
ORDER BY post_date DESC

Например:

+----+------------+------+----------+---------------+
| id | title      | uid  | username | comment_count |
+----+------------+------+----------+---------------+
|  3 | post-name3 |    2 | user2    |             0 | 
|  1 | post-name1 |    1 | user1    |             3 | 
|  2 | post-name2 |    1 | user1    |             1 | 
+----+------------+------+----------+---------------+
3 rows in set (0.01 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...