考虑下表:

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中)。如果要使用textgroup列,则必须使它成为子查询或进行其他选择WHERE rowid = 6的查询。

关于mysql - 如何找出表中特定组中特定行的行号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13937009/

10-12 23:34