来自评论
的表格结构:
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
有 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
最佳答案
您需要左连接
。我还推荐表别名:
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
关于mysql - 如何从 INNER JOIN 中 ORDER BY 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55840156/