在对mysqli结果进行排序后,获取一行的位置


Get the position of a row after sorting mysqli result

我正在寻找一种方法,在对我的mysqliresult进行排序后,获得特定项目的位置。我有一张这样的桌子:

id_______|_Name_____________|_ParentID
58       | Carl             | 15
55       | Clark            | 15
12       | David            | 4
23       | Sophie           | 15
45       | Amanda           | 15

我只对ParentID为15的行感兴趣,我想按它们的名称对它们进行排序。然后我想查看一个特定的项目,比如id 55(Clark),并知道它放在哪个行号上。我想生成一个这样的表:

id_______|_Name_____________|_ParentID
45       | Amanda           | 15
58       | Carl             | 15
55       | Clark            | 15
23       | Sophie           | 15

当我对克拉克感兴趣时,我想得到数字3,因为他的那一排是这个新表的第三排。

这可能与mysqli有关吗?如果不能在一条语句中完成,我必须循环浏览所有选定的项目,并对每个项目进行计数,直到找到正确的项目,但我真的希望避免这种情况,因为要循环浏览的项目数量会迅速增加。

试试这个:

SELECT t.*,
       (SELECT COUNT(*) FROM YourTable s
        WHERE t.parent_id = s.parent_id 
           and t.name <= s.name) as Cnt
FROM YourTable t

输出:

id_______|_Name_____________|_ParentID__|_Cnt
58       | Carl             | 15        |  2
55       | Clark            | 15        |  3
12       | David            | 4         |  1
23       | Sophie           | 15        |  4
45       | Amanda           | 15        |  1

现在Cnt列包含行位置,因此要获得它们的任何一个位置:

SELECT tt.cnt 
FROM (...above query here...) tt
WHERE tt.name = ? --optional
  AND tt.parent_id = ? --optional

您可以通过执行以下操作获得Clark的行:

select count(*)
from t
where t.ParentId = 15 and
      t.Name <= 'Clark';

索引t(Name, ParentId)将提高性能。

在mysql中,您可以使用用户定义变量

SELECT T.*,  if(@a, @a:=@a+1, @a:=1) as rownum 
FROM T
WHERE ParentID=15
ORDER BY Name

SQLFiddle演示

尝试

SELECT * FROM table_name WHERE parent_id = 15 ORDER BY name ASC;