我有一个存储团队的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
{队{1}}
使用:
VALUES
(1, 'one'),
(2, 'two'),
(3, 'three'),
(4, 'four'),
(5, 'five');
返回正确的rowNumber,因为表中实际上有三行。但这只有在我不删除一行时才有效。
示例:
我想说我SELECT id, name, id as rowNumber FROM teams WHERE id = 4
当我现在使用DELETE FROM teams WHERE id = 3;
时,结果是错误的,因为现在表格中只有两行(id的1& 2)。
如何从一个特定行获取id排序的“真实”行号/索引?
答案 0 :(得分: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
答案 1 :(得分:1)
您将ID
视为rowNumber
,因此只返回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;
答案 2 :(得分:0)
为什么要在持久层内部打扰行索引?
如果你真的需要依赖存储的tupples的“索引”,你可以引入一个变量并在每行的查询/程序代码中递增它。
编辑: 刚发现一个:: With MySQL, how can I generate a column containing the record index in a table?