Сортировка по времени с двумя рядами

У меня есть таблица SQL:

+----+-----+-------+-------+
| id | reg |  in   | out   |
+----+-----+-------+-------+
|  1 | a   | 11:10 |       |
|  2 | a   |       | 11:30 |
|  3 | b   | 06:10 |       |
|  4 | c   |       | 07:10 |
+----+-----+-------+-------+

У меня есть сортировка по массиву, так что он будет совпадать, если reg то же самое и в перед раньше, так, например:

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: я здесь, поскольку SQL будет сортировать WHERE> midnight и < 00:01 этим утром, показывая только текущий день.

Наверное, на меня пялилось что-то действительно простое и очевидное, но я этого не вижу.

4

Решение

Я бы сделал это в 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))
1

Другие решения

Вы можете создать значение сортировки с 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 будет лучшим вариантом.

0

По вопросам рекламы [email protected]