0

我有一个表,我想在其中对其中一列等于我定义的值的行进行排名。

例如,在此表中,我想获取 Col1 = a 的所有行,然后找到 Col3 = Ross 的行的排名(按 Col2 中的分数排名)。

Col1 | Col2 | Col3
------------------
a    | 10   | John
a    | 6    | Nick
a    | 8    | Ross
a    | 2    | Tim
a    | 4    | Paul
b    | 9    | John
b    | 3    | Nick
b    | 5    | Ross
b    | 7    | Tim
b    | 1    | Paul

最终我想计算这个:

Col1 | Col2 | Col3 | Rank
-------------------------
a    | 10   | John | 1
a    | 8    | Ross | 2
a    | 6    | Nick | 3
a    | 4    | Paul | 4
a    | 2    | Tim  | 5

并打印结果“2”。

我可以用这个查询对表进行排序,但不要;知道如何打印我需要的结果(使用 php)。

$query = "SELECT * FROM exampleTable WHERE Col1 = a order by Col2 DESC";
4

3 回答 3

1

试试这个:

"SET @rank=0; SELECT * FROM (SELECT *, @rank:=@rank+1 AS Rank FROM exampleTable WHERE Col1 = 'a' order by Col2 DESC) AS t"

这是一个显示它工作的测试运行。

如果您想查找罗斯的排名,您可以运行WHERE Col3 = 'Ross'添加的查询,并且只选择排名列,如此处所示

于 2012-10-23T19:18:27.183 回答
1

与 pdo

首先创建pdo连接

$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 
       'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, 
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

比这样使用

$query= $pdo->prepare("SELECT * FROM exampleTable WHERE Col1 = a order by Col2 DESC");

$query->execute();
$article=$query->fetchAll(pdo::FETCH_ASSOC);

如果内存确实比使用循环重要,我使用 fetchAll 而不是循环的原因是它更快

PDO::fetchAll 与 PDO::fetch 循环

于 2012-10-23T19:22:24.543 回答
0

要获得结果的排名,可以使用MySQL 8.0 以来的MySQL RANK() 函数。

您的查询将如下所示:

$query = "SELECT *, RANK() OVER (ORDER BY Col2 DESC) myRank FROM exampleTable WHERE Col1 = 'a'";
于 2020-01-23T17:00:38.133 回答