按时间顺序排列两行
Posted
技术标签:
【中文标题】按时间顺序排列两行【英文标题】:Sorting in order of time with two rows 【发布时间】:2016-03-20 01:29:24 【问题描述】:我有我的 SQL 表:
+----+-----+-------+-------+
| id | reg | in | out |
+----+-----+-------+-------+
| 1 | a | 11:10 | |
| 2 | a | | 11:30 |
| 3 | b | 06:10 | |
| 4 | c | | 07:10 |
+----+-----+-------+-------+
我将它排序到一个数组中,这样如果 reg 相同并且 in 在 out 之前它就会匹配,例如:
array(
[0]=> array('reg'=>'a','in'=>'11:10','out'=>'11:30'),
[1]=> array('reg'=>'b','in'=>'06:10','out'=>''),
[2]=> array('reg'=>'c','in'=>'','out'=>'07:10')
)
然后我需要使用这个数组,以便它按时间顺序排列,但是在同时存在输入和输出时间的情况下,只使用输出时间。因此,如果这是排序的,它将是:
array(
[0]=> array('reg'=>'b','in'=>'06:10','out'=>''),
[1]=> array('reg'=>'c','in'=>'','out'=>'07:10'),
[2]=> array('reg'=>'a','in'=>'11:10','out'=>'11:30')
)
我希望这是有道理的,我每天大约有 200 个条目,我整个周末都在尝试订购它,但似乎总是有一个迷路。
时间将是一个 unix 时间戳,我刚刚将它放在 H:i 中,因为 SQL 将排序 WHERE > 午夜和
可能有一些非常简单明了的东西在盯着我看,但我看不到。
【问题讨论】:
usort() 带有一个基于 max(in, out) 比较的回调? 虽然如果数据来自数据库,使用 ORDER BY 子句处理排序 谢谢@MarkBaker usort() 实际上可能对我有用。我已经将 Order by 用于原始结果集,有时它们可能会出现乱序,因此我需要一种方法将它们重新排序。再次感谢 【参考方案1】:我会在您查询数据时在 SQL 中执行此操作,假设 out
日期晚于 in
日期:
select reg, max(`in`) as maxin, max(`out`) as maxout from table
group by reg
order by greatest(maxin,ifnull(maxout,0))
【讨论】:
这只有在每个reg
只签入和签出一次时才有效。如果他们第二天再次访问,您将得到错误的结果。
@GeraldSchneider 1. OP 没有提供这样的例子,我们甚至不知道这是否可能。 2. OP 没有提供任何关于如果有多个输入和输出我们应该做什么的指针。如果在查询期间有多个进出,那么我的解决方案将按最后一个进/出对排序。在没有明确定义的情况下,您不能认为这是错误的。【参考方案2】:
您可以使用IF()
创建排序值:
SELECT `reg`,`in`,`out`, IF(`out`='00:00:00', `in`,`out`) AS sortfield
FROM `test`
ORDER BY sortfield
这假定您的 in
和 out
字段属于 TIME
类型。它检查out
是否具有值00:00:00
,这是空时的默认值。如果是,则排序值将从in
获取值,否则将获取out
,因此它始终被填充。
当然,恰好在 00:00:00 签入或签出会是一个问题,因此最好将字段 NULL
设为空并检查。
对于长期记录,DATETIME
类型将是最佳选择。
【讨论】:
我需要在 reg 匹配时匹配行,所以我认为这行不通?不过谢谢。与时俱进,场上总会有时间,所以我不必担心 0 会被误认为是中午/午夜以上是关于按时间顺序排列两行的主要内容,如果未能解决你的问题,请参考以下文章