Php mysql左外连接排名
我正试着用左外联来排名 我的sql是:Php mysql左外连接排名,php,mysql,sql,Php,Mysql,Sql,我正试着用左外联来排名 我的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
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
;
您正在以
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+中,应该使用
行号()
8+中不推荐使用变量
在早期版本中,您可以使用变量,但它们往往不遵守排序依据
或分组依据
。因此,对于这些构造,您需要一个子查询:
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;
在MySQL 8+中,应该使用行号()
8+中不推荐使用变量
在早期版本中,您可以使用变量,但它们往往不遵守排序依据
或分组依据
。因此,对于这些构造,您需要一个子查询:
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;
不起作用,排名是错误的。我想按票数排序并对投票最多的人进行排名不起作用,排名数字是错误的。我想按票数排序并对投票最多的人进行排名你的问题缺乏细节。你的问题缺乏细节。