按时间顺序排列两行

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

这假定您的 inout 字段属于 TIME 类型。它检查out 是否具有值00:00:00,这是空时的默认值。如果是,则排序值将从in 获取值,否则将获取out,因此它始终被填充。

当然,恰好在 00:00:00 签入或签出会是一个问题,因此最好将字段 NULL 设为空并检查。

对于长期记录,DATETIME 类型将是最佳选择。

【讨论】:

我需要在 reg 匹配时匹配行,所以我认为这行不通?不过谢谢。与时俱进,场上总会有时间,所以我不必担心 0 会被误认为是中午/午夜

以上是关于按时间顺序排列两行的主要内容,如果未能解决你的问题,请参考以下文章

全排列

按字母顺序排列的字典键[重复]

用单词和数字按字母顺序排列字符串

vis.js 时间线视图中按时间顺序排列的项目集

Pandas 按顺序排列列

输入的单词是不是按字母顺序排列?