2015-12-14 2 views
4

У меня есть SQL таблицу:Сортировка в порядке времени с двумя рядами

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

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

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

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

+0

usort() с обратным вызовом, который сравнивается на основе max (in, out)? –

+1

Хотя, если данные поступают из базы данных, обрабатывайте сортировку с помощью предложения ORDER BY –

+0

. Спасибо, что @MarkBaker usort() может работать для меня. Я уже использую Order by для исходного набора результатов, иногда они могут выйти из строя, поэтому мне нужен способ отсортировать их снова. Еще раз спасибо – Browners

ответ

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)) 
+0

Это будет работать, только если каждый 'reg' проверяет только один раз. Если они снова посещают следующий день, вы получите неправильные результаты. –

+0

@GeraldSchneider 1. OP не дает такого примера, мы даже не знаем, возможно ли это. 2. OP не предоставляет указателя относительно того, что мы должны делать, если есть несколько входов и выходов. Если в запрошенном периоде есть несколько входов и выходов, то мое решение будет заказывать последние пары входов/выходов. В отсутствие четкого определения вы не можете предположить, что это неправильно. – Shadow

0

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

Мне нужно совместить строки, когда рег подходит, поэтому я не думаю, что это сработает? Спасибо хоть. Со временем всегда будет время в поле, поэтому мне не нужно беспокоиться о том, что 0 были приняты за полдень/полночь – Browners