1

我有一个存储团队的 MYSQL 表。

表结构:
CREATE TABLE teams ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(28) COLLATE utf8_unicode_ci NOT NULL, UNIQUE KEY id (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

样本数据:
INSERT INTO团队VALUES (1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, 'five');

使用:
SELECT id, name, id as rowNumber FROM teams WHERE id = 4
返回正确的 rowNumber,因为在表中它前面确实有三行。但这只有在我不删除一行的情况下才有效。

示例:
假设DELETE FROM teams WHERE id = 3;
我现在使用SELECT id, name, id as rowNumber FROM teams WHERE id = 4结果是错误的,因为表中现在只有两行(id 的 1 和 2)在它前面。

如何从一个特定行获取按 id 排序的“真实”行号/索引?

4

3 回答 3

2

您正在转为 rturning IDrowNumber因此它只是返回ID列值。为什么你期望它会有所不同?

我认为您可能想要定义和@curRow变量以获取行号并使用子查询,如下所示:

 SELECT * from 
    (SELECT  ID, 
         NAME, 
         @curRow := @curRow + 1 AS rowNumber
      FROM    Teams t
      JOIN    (SELECT @curRow := 0) curr
      ORDER by t.ID asc) as ordered_team
 WHERE ordered_team.id = 4;
于 2012-10-20T15:03:29.590 回答
2

这不是一个好方法,但是使用普通的 sql:

SELECT
    t.id,
    t.name,
    (SELECT COUNT(*)+1 FROM teams WHERE id < t.id) as row_number
FROM teams t
WHERE t.id = 4
于 2012-10-20T15:17:48.397 回答
0

为什么要打扰持久层内的行索引?

如果您真的需要依赖存储的元组的“索引”,您可以引入一个变量并在每行的查询/程序代码中递增它。

编辑:刚刚发现一个::使用 MySQL,如何在表中生成包含记录索引的列?

于 2012-10-20T15:05:56.073 回答