【问题标题】:mysql left outer join rankingmysql左外连接排名
【发布时间】:2020-04-03 03:27:28
【问题描述】:

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

我的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

【问题讨论】:

  • 您的问题缺乏细节。

标签: php mysql sql


【解决方案1】:

您以ASC方式订购,请将其更改为DESC。像这样:

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 DESC
;

【讨论】:

    【解决方案2】:

    在 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;
    

    【讨论】:

      【解决方案3】:

      不起作用,等级数错误。我想按票数排序并排名投票最多的人

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-07
        • 2018-09-04
        • 2014-06-17
        • 1970-01-01
        • 1970-01-01
        • 2013-02-25
        • 2013-09-07
        相关资源
        最近更新 更多