[英]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 BY
或GROUP 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.