comments
中的表结构:
id | user_id | cmt_id | slug
1 | 565 | 5 | home
2 | 324 | 6 | home
3 | 71 | 7 | home
4 | 408 | 1 | about
cmt_likes
中的表结构:
id | user_id | cmt_id | slug
1 | 324 | 6 | home
2 | 324 | 6 | home
3 | 324 | 6 | home
4 | 71 | 7 | home
5 | 71 | 7 | home
如表cmt_likes
上所示,在home
页上,用户324
的评论有3个赞,用户71
的评论有3个赞2个赞(我使用行数,具有相同的cmt_id
和slug
来计算喜欢)。
这是我当前的sql,仅用于显示注释:
SELECT
`comments`.`user_id`, `comments`.`cmt`, `comments`.`cmt_id`, `comments`.`slug`, `users`.`username`
FROM `comments`
INNER JOIN `users`
ON `comments`.`user_id` = `users`.`user_id`
WHERE `comments`.`slug` = :slug
ORDER BY `comments`.`id` DESC
但是我想ORDER BY
点赞次数。
所以我尝试了:
SELECT
`comments`.`user_id`, `comments`.`cmt`, `comments`.`cmt_id`, `comments`.`slug`, `cmt_likes`.`cmt_id`, `users`.`username`
FROM `comments`
INNER JOIN `users`
ON `comments`.`user_id` = `users`.`user_id`
INNER JOIN `cmt_likes`
ON `comments`.`cmt_id` = `cmt_likes`.`cmt_id`
WHERE `comments`.`slug` = :slug
GROUP BY `cmt_likes`.`cmt_id`
ORDER BY `cmt_likes`.`cmt_id` DESC
但是此sql仅返回具有“喜欢”的行。如果查看我的表,您将看到来自用户565
的评论没有点赞,因此该行不在上面的sql中返回。
这是我使用上述sql的当前结果:
324
71
这就是我所期望的:
324
71
565
答案 0 :(得分:1)
您需要left join
个。我还建议使用表别名:
SELECT c.user_id, c.cmt, c.cmt_id, c.slug,
c.cmt_id, u.username
FROM comments c LEFT JOIN
users u
ON c.user_user = u.user_id LEFT JOIN
cmt_likes cl
ON c.cmt_id = cl.cmt_id
WHERE c.slug = :slug
GROUP BY c.user_id, c.cmt, c.cmt_id, c.slug, c.cmt_id, u.username
ORDER BY cl.cmt_id DESC
但是,我认为您还需要在JOIN
之前进行汇总:
SELECT c.user_id, c.cmt, c.cmt_id, c.slug,
c.cmt_id, u.username
FROM comments c LEFT JOIN
users u
ON c.user_user = u.user_id LEFT JOIN
(SELECT cl.cmt_id, COUNT(*) as cnt
FROM cmt_likes cl
GROUP BY cl.cmt_id
) cl
ON c.cmt_id = cl.cmt_id
WHERE c.slug = :slug
GROUP BY c.user_id, c.cmt, c.cmt_id, c.slug, c.cmt_id, u.username
ORDER BY cl.cmt_id DESC