mysql - 如何从 INNER JOIN 中 ORDER BY 列

标签 mysql sql sql-order-by inner-join

来自评论的表格结构:

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_idslug 的行数来计算点赞)。

这是我当前的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/

相关文章:

mysql - 如何验证数据源名称是否有效?

Mysql查询。更新、乘法、连接和选择(?)全部放在一起

mysql - 如何延迟加载或急切加载关联表的总和?

mysql - 对 INT 字段执行 LIKE 比较

mysql - C* 迁移——将 1B+ 行表数据移动到新的模式表

mysql - 如何添加列表或字典作为 SQL 表条目?

sql - MySQL连接三张表并求平均值

sql - Heroku PostgreSQL 按字母顺序排列

mysql - Mysql中Group By和Order By的使用

mysql - 在 order by 旁边使用 case 时出错