MySql函数和Mysql函数内部的会话/用户变量

时间:2018-11-24 00:23:06

标签: php mysql sql

我想创建一个MySql函数,只要给定的id是相同的,它将返回递增的行计数,如果id更改函数将重置从1开始的计数。

以下是我正在寻找的结果,您可以在其中看到,只要itemId(在左列)保持不变,右列的Count就会递增,当itemId更改时,Count将从1重新开始。 / p>

enter image description here
在我看来,类似于下面的MySql函数将执行增量计数和重置,但不幸的是,每行它返回1。我的想法是为该函数提供当前的itemId,该函数会将发送的ID与最后一行中@n会话变量中保存的ID进行比较,只要ID相同,该函数将返回递增的行数,否则它将重置为1。 谁能指导我为什么该功能不起作用?还是有更好的方法来达到我想要的结果?

CREATE FUNCTION `nth`(id int) RETURNS tinyint(4)
BEGIN
declare ln tinyint;
if @saved_id = id then
    set @n := @n+1;
    set ln = @n;
else
    set @saved_id := id;
    set @n := 1;
    set ln = @n;
end if;
RETURN ln;
END
  

我正在使用的Mysql版本是5.7

这是我正在使用的示例查询,itemId是外键

select id, itemId, started_at 'Start', stopped_at Stop, nth(started_at) 'Count'
from events
order by itemId, stopped_at

1 个答案:

答案 0 :(得分:1)

您不需要为此定义UDF。您可以在postversion查询本身中实现此目的。在较新版本的MySQL(8.0.2 and above)中,可以使用ROW_NUMBER() OVER (PARTITION BY itemId ORDER BY id)

来实现。

在旧版本中,我们可以使用用户定义的变量。在Derived TableSELECT子句中的子查询)中,我们对数据进行排序,以使所有具有相同FROM值的行都合并在一起,并根据{{1}在它们之间进行进一步排序}。

现在,我们使用此结果集并使用条件itemId表达式来计算编号(“ count”)。就像循环技术(我们在应用程序代码中使用的,例如:PHP)一样。我们将前一行的值存储在用户定义的变量中,然后对照前一行检查当前行的值。最终,我们将相应地分配行号(“计数”)。

id