选择具有每天每条记录的创建顺序的行
Posted
技术标签:
【中文标题】选择具有每天每条记录的创建顺序的行【英文标题】:Select rows with each record's creation order per day 【发布时间】:2013-12-06 12:50:34 【问题描述】:我想从我的表中选择所有行,但还包含该行创建日中每一行的哪个值。
更详细:“当天第一条记录,当天第二条记录”。
例如,假设我有这个带有行的表:
name | created_at
-----------------
john | 2013-02-04 10:00
bob | 2013-02-04 14:00
dale | 2013-02-05 09:00
lucy | 2013-02-06 11:00
sean | 2013-02-06 13:00
sal | 2013-02-06 18:00
所以当我选择所有这些值时,我需要的结果是:
name | created_at | which_record
---------------------------------------
john | 2013-02-04 10:00 | 1
bob | 2013-02-04 14:00 | 2
dale | 2013-02-05 09:00 | 1
lucy | 2013-02-06 11:00 | 1
sean | 2013-02-06 13:00 | 2
sal | 2013-02-06 18:00 | 3
有没有办法得到这个which_record
值而不选择值并为每条记录或复杂的子查询再次计算?
我可以选择全部并为每条记录生成这个which_record
,或者我可以为每条记录选择以前的记录计数,但我担心如果为每一行运行这个子查询会减慢响应速度。
有什么替代方案或建议吗?
【问题讨论】:
这是您的订单表? 我想知道触发器是否可以在您的情况下完成这项工作?每次您在表格中添加一行时,它都会计算每日订单。 @uvais,我编辑了这个问题,因为“订单”一词看起来很混乱。我的意思是“第一条记录”,“第二条记录”作为“订单”。不像销售订单。 @bh42 你的意思是,将这个值存储在某个地方?我不需要,每次选择行时都需要动态计算。 @kubilay 是的,这就是我的意思。好的,所以这不是你需要的:) 【参考方案1】:试试这个:
SELECT id, name, created_at,
IF(@prev = date(created_at), @s:=@s+1, @s:=1) AS daily_order,
@prev:=date(created_at) as dummy
FROM table1, (SELECT @s:= 0, @prev:='') s
ORDER BY created_at
工作演示:http://sqlfiddle.com/#!2/d3ad43/1
检查您的数据以查看性能影响。
【讨论】:
这太棒了,谢谢。如果我必须涉及子查询,这是我的选择: (SELECT COUNT( mt2.id
) + 1 FROM mytable
mt2 WHERE DATE( mt2.created_at
) = DATE( mytable.created_at
) AND mytable.@ 987654327@ > mt2.created_at
) AS daily_order
以上是关于选择具有每天每条记录的创建顺序的行的主要内容,如果未能解决你的问题,请参考以下文章
以准确的 MAX 顺序获取特定时间戳之间具有 MAX 值的记录