簡體   English   中英

mysql 左外連接排名

[英]mysql left outer join ranking

我正在嘗試使用左外連接進行排名

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

您以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
;

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

不行,排號錯了。 我想按票數排序並排名投票最多的人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM