一尘不染

MySQL在ORDER BY中获得行位置

mysql

用下面的MySQL表:

+-----------------------------+
+ id INT UNSIGNED             +
+ name VARCHAR(100)           +
+-----------------------------+

当按排序时,如何选择 单行 及其在表中其他行中的位置name ASC。因此,如果表数据看起来像这样,按名称排序时:

+-----------------------------+
+ id | name                   +
+-----------------------------+
+  5 | Alpha                  +
+  7 | Beta                   +
+  3 | Delta                  +
+ .....                       +
+  1 | Zed                    +
+-----------------------------+

如何选择Beta要获取该行当前位置的行?我正在寻找的结果集将是这样的:

+-----------------------------+
+ id | position | name        +
+-----------------------------+
+  7 |        2 | Beta        +
+-----------------------------+

我可以做一个简单的操作,SELECT * FROM tbl ORDER BY name ASC然后枚举PHP中的行,但是仅为单个行加载可能较大的结果集似乎很浪费。


阅读 529

收藏
2020-05-17

共1个答案

一尘不染

用这个:

SELECT x.id, 
       x.position,
       x.name
  FROM (SELECT t.id,
               t.name,
               @rownum := @rownum + 1 AS position
          FROM TABLE t
          JOIN (SELECT @rownum := 0) r
      ORDER BY t.name) x
 WHERE x.name = 'Beta'

…以获得唯一的位置值。这个:

SELECT t.id,
       (SELECT COUNT(*)
          FROM TABLE x
         WHERE x.name <= t.name) AS position,
       t.name    
  FROM TABLE t      
 WHERE t.name = 'Beta'

…将赋予领带相同的价值。IE:如果第二个值有两个,则当第一个查询将其中一个赋予2的位置,将另一个赋予3的位置时,它们的位置均为2。

2020-05-17