Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按列分组的查询结果的行号_Mysql - Fatal编程技术网

Mysql 按列分组的查询结果的行号

Mysql 按列分组的查询结果的行号,mysql,Mysql,我有一个包含以下列的表: id| fk|U id|rcv|U日期 可能有多个记录具有公共fk_id,该id表示相关表中的外键id 我需要创建一个查询,为每个记录分配一个行号,按fk_id分组,按rcv_日期排序 我最初是从以下查询开始的,该查询对于排序和分配行号非常有效: SELECT @row:=@row +1 AS ordinality, c.fk_id, rcv_date FROM (SELECT @row:=0) r, mytable c ORDER BY rcv_date 但是,行计

我有一个包含以下列的表: id| fk|U id|rcv|U日期

可能有多个记录具有公共fk_id,该id表示相关表中的外键id

我需要创建一个查询,为每个记录分配一个行号,按fk_id分组,按rcv_日期排序

我最初是从以下查询开始的,该查询对于排序和分配行号非常有效:

SELECT @row:=@row +1 AS ordinality, c.fk_id, rcv_date
FROM (SELECT @row:=0) r, mytable c
ORDER BY rcv_date
但是,行计数和排序是在整个数据集中完成的。我需要计数在公共fk_id内。例如,以下示例数据将返回表示行计数/顺序的第一列:

1 | 5 | 2011-10-01
2 | 5 | 2011-10-14
3 | 5 | 2011-11-02
4 | 5 | 2011-12-17
1 | 8 | 2011-09-03
2 | 8 | 2011-11-12
1 | 9 | 2011-10-08
2 | 9 | 2011-10-10
3 | 9 | 2011-11-19
中间一列表示fk_id。如您所见,排序和行计数在fk_id分组中

更新 我有一个查询似乎正在运行,但想了解一下是否可以改进:

SELECT IF(@last = c.fk_id, @row:=@row +1, @row:=1) AS ordinality, @last:=c.fk_id, c.fk_id, rcv_date
FROM (SELECT @row:=0) r, (SELECT @last:=0) l, mytable c
ORDER BY c.fk_id, rcv_date
因此,它的作用是按fk_id排序,然后按rcv_日期排序,这基本上处理了我的分组。然后我使用第二个变量来比较前一条记录中的fk_id与当前记录:如果相同,则增加行数;如果不同,我们将重置为1


我对真实数据的测试似乎正在运行。不过,我怀疑这是一个相当低效的查询——因此,如果有人有改进的想法,或者看到可能存在的缺陷,我很乐意听到。

这应该非常简单

SELECT (CASE WHEN @fk <> fk_id THEN @row:=1 ELSE @row:=@row + 1 END) AS ordinality, 
       @fk:=fk_id, rcv_date
FROM   (SELECT @row:=0) AS r, 
       (SELECT @fk:=0) AS f, 
       (SELECT fk_id, rcv_date FROM files ORDER BY fk_id, rcv_date) AS t
我先按fk_id订购,以确保您的所有外键都在一起,如果它们不在表中怎么办?然后我按您的首选订购,即按rcv_日期订购。查询将检查fk_id是否有更改,如果有更改,则将row number变量设置为1,否则该变量将递增。它在case语句中处理。请注意,@fk:=fk_id是在大小写检查之后完成的,否则它将影响行号


编辑:刚刚注意到你自己的解决方案和我最终的解决方案是一样的。荣誉!:

@Icdservices您不应该在同一查询中按此排序。这会破坏你来之不易的平凡。首先在内部查询中对其排序,然后按照我的解决方案进行排序