MySQL在ORDER BY中获得行位置

用下面的MySQL表格:

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

如何在按name ASCsorting时,如何select单个行及其在表中其他行之间的位置。 所以如果表格数据看起来像这样,按名称sorting:

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

我怎么能select得到该行当前位置的Beta行? 我正在寻找的结果集是这样的:

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

我可以做一个简单的SELECT * FROM tbl ORDER BY name ASC然后枚举PHP中的行,但是对于单行加载一个潜在的大的结果集似乎是浪费的。

用这个:

 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时,它们的位置都是2,而另一个的位置是3。

这是我能想到的唯一方法:

 SELECT `id`, (SELECT COUNT(*) FROM `table` WHERE `name` <= 'Beta') AS `position`, `name` FROM `table` WHERE `name` = 'Beta' 

如果查询很简单并且返回结果集的大小可能很大,那么您可以尝试将其分成两个查询。

第一个查询的筛选条件只是为了检索该行的数据,第二个查询使用了COUNTWHERE子句来计算位置。

例如你的情况

查询1:

SELECT * FROM tbl WHERE name = 'Beta'

查询2:

SELECT COUNT(1) FROM tbl WHERE name >= 'Beta'

我们在一个2Mlogging的表中使用这种方法,这比OMG的方法更具可扩展性。

我有一个非常非常相似的问题,这就是为什么我不会问同样的问题,但我会在这里分享我做了什么,我不得不使用一个小组,并由AVG命令。 有学生,签名和socore,我必须排名他们(换句话说,我首先计算AVG,然后命令他们在DESC,然后最后我需要添加的位置(排名我),所以我东西非常相似 ,在这里最好的答案 ,适应我的问题一点点的变化):

我终于把外部SELECT中的position (等级为我)列

 SET @rank=0; SELECT @rank := @rank + 1 AS ranking, t.avg, t.name FROM(SELECT avg(students_signatures.score) as avg, students.name as name FROM alumnos_materia JOIN (SELECT @rownum := 0) r left JOIN students ON students.id=students_signatures.id_student GROUP BY students.name order by avg DESC) t 

表中一行的位置表示有多less行比目标行“更好”。

所以,你必须统计这些行。

SELECT COUNT(*)+ 1 FROM table WHERE name <'Beta'

在平局的情况下,返回最高的位置。

如果在现有的“Beta”行之后添加具有相同名称“Beta”的另一行,则返回的位置将仍然是2,因为它们将在分类中共享相同的位置。

希望这有助于将来寻找类似的人,因为我相信问题的所有者已经解决了他的问题。

可能是你需要的是添加语法

限制

所以使用

 SELECT * FROM tbl ORDER BY name ASC LIMIT 1 

如果你只需要一行