首页 > 解决方案 > mysql左外连接排名

问题描述

我正在尝试使用左外连接进行排名

我的 sql 是:

SET @rank=0;

SELECT @rank:=@rank+1 AS rank, h.name, COUNT(v.hId) AS votes
  FROM users h LEFT OUTER JOIN users_votes v ON h.id = v.hId GROUP BY h.id
 ORDER BY rank ASC
;

正确的做法是像这样返回

rank |  name    |   votes

1   Luck        4   
2   Marc        3
3   Santos      2
4   Matheus     0

但它以错误的方式返回:

rank |  name    |   votes

1   Santos      2   
2   Marc        3
3   Luck        4
4   Matheus     0

标签: phpmysqlsql

解决方案


在 MySQL 8+ 中,您应该使用row_number()

SELECT ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as rank,
       h.name, COUNT(*) AS votes
FROM users h LEFT OUTER JOIN
     users_votes v
     ON h.id = v.hId
GROUP BY h.id
ORDER BY rank ASC;

变量在 8+ 中已弃用。

在早期版本中,您可以使用变量,但它们往往不尊重ORDER BYGROUP BY。因此,使用这些构造,您需要一个子查询:

SELECT (@rn := @rn + 1) as rank, hv.*
FROM (SELECT h.name, COUNT(*) AS votes
      FROM users h LEFT OUTER JOIN
           users_votes v
           ON h.id = v.hId
      GROUP BY h.id
      ORDER BY rank ASC
     ) hv CROSS JOIN
     (SELECT @rn := 0) params;

推荐阅读