Mysql 按列分组的查询结果的行号
我有一个包含以下列的表: id| fk|U id|rcv|U日期 可能有多个记录具有公共fk_id,该id表示相关表中的外键id 我需要创建一个查询,为每个记录分配一个行号,按fk_id分组,按rcv_日期排序 我最初是从以下查询开始的,该查询对于排序和分配行号非常有效: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 但是,行计
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您不应该在同一查询中按此排序。这会破坏你来之不易的平凡。首先在内部查询中对其排序,然后按照我的解决方案进行排序