如何按INNER JOIN的列排序

时间:2019-04-25 00:16:35

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

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_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

1 个答案:

答案 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