考虑下表:
rowid | text | group
1 | a | 1
2 | b | 2
3 | c | 2
4 | d | 3
5 | e | 4
6 | f | 1
7 | g | 1
8 | h | 4
9 | j | 5
10 | k | 2
11 | i | 3
12 | l | 3
现在想象一下,我想要
rowid
6的行号(例如用于分页)。由于它是自动递增的,因此选择where rowid = 6
非常简单,但是在这种情况下,我想知道组1中的行号。显然,在这么小的示例中(第2行),用肉眼就能做到这一点很容易。
行号1将为
rowid = 1
。行号2将是
rowid = 6
。第3行为
rowid = 7
。我的第一个想法是这样的:
SELECT
tmp.rowid,
tmp.text,
tmp.group,
tmp.row_number
FROM
(
SELECT
`rowid`,
`text`,
`group`,
(@rowNumber := @rowNumber + 1) as `row_number`
FROM
`my_table`,
(SELECT @rowNumber := 0) as `r`
WHERE
`group` = 1
ORDER BY
`rowid` DESC
) as `tmp`
WHERE
tmp.rowid = 6
这将给出正确的结果(在
row_number
中),但是在一个大表(半百万条记录)上,这将花费2.5秒钟在快速服务器上,因为它必须首先收集所有500,000个条目,然后选择行编号6。我应该怎么做才能更快/更好?
最佳答案
解决方案实际上非常简单。
的SQL
SELECT
COUNT(`rowid`) as `row_number`
FROM
`my_table`
WHERE
`group` = 1
AND
`rowid` >= 6
注意
您需要使行具有递增的值(例如时间戳,递增的ID等)。
在这里,我们将原始的
ORDER BY rowid DESC
转换为WHERE
rowid >= '6'
。如果使用ORDER BY
升序,则将改为使用<=
。查询需要0.00002秒,并返回正确的行号(在
row_number
中)。如果要使用text
和group
列,则必须使它成为子查询或进行其他选择WHERE rowid = 6
的查询。关于mysql - 如何找出表中特定组中特定行的行号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13937009/