用下面的MySQL表:
+-----------------------------+ + id INT UNSIGNED + + name VARCHAR(100) + +-----------------------------+
当按排序时,如何选择 单行 及其在表中其他行中的位置name ASC。因此,如果表数据看起来像这样,按名称排序时:
name ASC
+-----------------------------+ + id | name + +-----------------------------+ + 5 | Alpha + + 7 | Beta + + 3 | Delta + + ..... + + 1 | Zed + +-----------------------------+
如何选择Beta要获取该行当前位置的行?我正在寻找的结果集将是这样的:
Beta
+-----------------------------+ + id | position | name + +-----------------------------+ + 7 | 2 | Beta + +-----------------------------+
我可以做一个简单的操作,SELECT * FROM tbl ORDER BY name ASC然后枚举PHP中的行,但是仅为单个行加载可能较大的结果集似乎很浪费。
SELECT * FROM tbl ORDER BY name ASC
用这个:
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。