如何在mysql表中找到一行的位置


How to find the position of a row in a mysql table?

是否可以在mysql表中找到一行的位置?

例如,如果我们有mysql查询

SELECT * FROM `table` WHERE `Date` > X ORDER BY `Date` DESC

这将选择在X之后创建的所有行,并根据创建日期对它们进行排列。现在,如果我知道其中一行的ID,是否可以修改这个查询代码,以便我知道它在这个查询中的位置。

我的意思是说查询给出了5行,我知道它的ID是其中之一,是否有可能检查它在查询中的位置。我是说,是第一,第二,还是…, 5日。

我希望我把问题解释清楚了。

使用Blizz的建议,我发现

SET @I=0; SELECT @I:=@I+1 AS `I`, `ID`, `From`, `Action`, `To`, `Value`, `Date` FROM `papers` WHERE `Action` = 'Review'  GROUP BY `ID` ORDER BY `Date` DESC

做我想要的,但它只在localhost/phpmyadmin中工作,当我在localhost/mysite中运行它时,出现一个错误,说

你的SQL语法有错误;查看手册对应于MySQL服务器版本,以便使用正确的语法SELECT:=@rank+1 AS rank, ID, From, Action, ToValue, Date FROM " at line 1

有人知道为什么会这样吗?

您的示例SQL语句是2个实际语句。大多数php MySQL函数都是在一条语句上工作的。

可以使用交叉连接强制变量初始化:-

SELECT @I:=@I+1 AS `I`, `ID`, `From`, `Action`, `To`, `Value`, `Date` 
FROM `papers` 
CROSS JOIN 
(
    SELECT @I := 0
) sub0
WHERE `Action` = 'Review'  
GROUP BY `ID` 
ORDER BY `Date` DESC

请注意,与处理变量的位置相比,字段的顺序也可能存在问题,您可能应该在处理变量以添加计数器之前对子查询中的数据进行排序。

SELECT @I:=@I+1 AS `I`, `ID`, `From`, `Action`, `To`, `Value`, `Date` 
FROM `papers` 
(
    SELECT `ID`, `From`, `Action`, `To`, `Value`, `Date` 
    FROM `papers` 
    WHERE `Action` = 'Review'  
    GROUP BY `ID` 
    ORDER BY `Date` DESC
)
CROSS JOIN 
(
    SELECT @I := 0
) sub0
ORDER BY `Date` DESC