MySQL中的行号

5

在MySQL中是否可以获取行号?比方说我有一张 'table'

ID  tag name
1   A   alpha
4   B   beta
5   C   gamma
8   D   ceta

我该如何在MySQL中获取表中第三行为“C”呢?以下是解决方法:

SET @pos=0;
SELECT @pos:=@pos+1,tag FROM table ORDER BY tag ASC;

计算行数的功能已经实现,但是(对于代码结构的无知非常抱歉)。
SET @pos=0;
SELECT @pos:=@pos+1,tag FROM table where tag='C' ORDER BY tag ASC;

返回结果只有1行,pos的值是0,这很正常。

是否有方法可以使'pos'的值变为我所需要的'3'呢? (排序也很重要,无论与问题是否相关。)


如何在MySql中知道特定行的行号?这是一个未被回答的问题,但它包含了一个获取特定行行号的SQL查询。 - Lion
1
表格没有行号,因为它们实际上没有顺序。当然,在现实世界中,行是按某种顺序放在硬盘上的,但这并不意味着任何东西。如果您想要有序的数字,它们需要在一个专门用于此目的的列中,或者受到您ORDER BY子句的特定限制。 - siride
我可能只是误解了这个问题,但是在你现有的SELECT语句中添加LIMIT 1 OFFSET 3会有什么问题吗?顺便说一下,在这种情况下,“行号”是你ORDER BY子句的一个副产品。你似乎要求从查询结果的开头偏移一个项目,偏移量为三(或者也许是两个,我不确定)。 - Jim Dennis
我可能误解了你的评论(我在MySQL方面不太擅长,正如你所看到的那样),但问题是我不知道'C'是第3个数字。我需要知道的是它在哪一行。 - Konservin
@Konservin:不是任何一行。除非你创建一个存储一些序号的列,否则没有行号。 - siride
@siride:好的,我会添加自动递增(实际上已经有了)。但是如果我有成千上万条记录,并且在其中删除了很多记录,那么我该如何处理呢? - Konservin
3个回答

4
你可以使用这个。
Select rownum from (
SELECT @rownum:=@rownum+1 rownum, t.*FROM (SELECT @rownum:=0) r, table t order by tag) as t1
where tag = 'C'

谢谢Dany,根据一些快速测试,这似乎完美地运行了。现在每次 'C' 都是3。阻止我将其标记为答案的是Siride的评论..那里可能会有一些问题吗? - Konservin
@Konservin:这里并没有什么问题。这是一种为特定结果集创建动态行数的有效方法。只要你对此没有意见,那么这就是一个很好的答案(或者是我建议添加一个带有持久排序的列)。然而,请注意,如果在B和C之间插入任何行,这个查询中的编号将会改变。 - siride
1
@Konservin,进一步解释一下,@siride是正确的,查询中没有行号,但这里发生的是,我们手动添加了一个包含行号的列,并为每一行递增它,@rownum:= @rownum + 1,并将此列称为rownum。然后我们从包含行号(我们制作的)的表中进行选择。 - Dany Y

1
如果您的ID严格按照行号递增,您可以执行以下操作:
SELECT COUNT(*) FROM tbl WHERE ID <= (SELECT ID FROM tbl WHERE tag = 'C');

我不确定您所说的“ordering”是什么意思。
顺便提一下:您的代码。
SET @pos=0;
SELECT @pos:=@pos+1,tag FROM tbl where tag='C' ORDER BY tag ASC;

无法工作,因为这里的 @pos 只对结果集进行操作,而结果集只包含一条记录。

有趣的是,它有效地运行了.. :) 它返回一个 pos=0 的记录。 - Konservin
我并不是说你的代码完全没有作用。我的意思是它没有返回你想要得到的数字3。但是我看到你对Dany Y的答案很满意,所以我猜你的问题已经解决了。 - luksch

0

其实,有一个可能性我之前没有考虑到:

SELECT count(1) FROM table WHERE tag <= 'C' ORDER BY tag

这似乎做了同样的事情,而且速度更快,我错过了什么吗?


这个解决方案跟我的一样,只是你现在依赖标签的顺序。我原以为你想保持按照ID的原始顺序。 - luksch
是的,我现在明白了。很抱歉没有更深入地研究你的答案。+许多 :) - Konservin
没问题。就像我说的那样,很高兴你的问题似乎已经解决了。 - luksch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接