Php mysql左外连接排名

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

我正试着用左外联来排名

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

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

不起作用,排名是错误的。我想按票数排序并对投票最多的人进行排名

不起作用,排名数字是错误的。我想按票数排序并对投票最多的人进行排名

你的问题缺乏细节。你的问题缺乏细节。