Я хочу как можно больше избежать php-кодирования, поэтому у меня есть следующий MySQL-запрос в php:
$data = $BookingModel
->select(sprintf("t1.*,
(SELECT GROUP_CONCAT(
CONCAT_WS('~.~', bs.service_id, DATE_FORMAT(FROM_UNIXTIME(bs.start_ts), '%%Y-%%m-%%d %%H:%%i:%%s'), m.content
) SEPARATOR '~:~')
FROM `%1\$s` AS `bs`
LEFT JOIN `%2\$s` AS `m` ON m.model='Service' AND m.foreign_id=bs.service_id AND m.field='name' AND m.locale='%3\$u'
WHERE bs.booking_id = t1.id) AS `items`
", "bookings_services", "multi_lang", 1))
->orderBy("$column $direction")->limit($rowCount, $offset)
->findAll()
->toArray('items', '~:~')
->getData();
Я пытаюсь сделать заказ здесь
bs.start_ts
чтобы даты нескольких служб бронирования, независимо от того, в какой день они находились, нужно сортировать от самой последней (максимальной) отметки времени до самой низкой (минимальной) отметки времени и наоборот.
Теперь я получаю результат как:
Service2 от пользователя2 —
2016-11-17 20:00Сервис2 от пользователя1 —
2016-11-16 11:00Сервис1 от пользователя1 —
2016-11-16 09:00Service1 от пользователя2 —
2016-11-30 12:00Service2 от пользователя2 —
2016-12-10 11:00Сервис1 от пользователя1 —
2016-12-09 09:00Сервис2 от пользователя1 —
2016-11-28 08:15
и результат должен быть таким (в порядке DESC предпочтительно):
Service2 от пользователя2 —
2016-12-10 11:00Сервис1 от пользователя1 —
2016-12-09 09:00Service1 от пользователя2 —
2016-11-30 12:00Сервис2 от пользователя1 —
2016-11-28 08:15Сервис1 от пользователя1 —
2016-11-16 09:00Сервис2 от пользователя1 —
2016-11-16 11:00Service2 от пользователя2 —
2016-11-17 20:00
Обратите внимание, что даты каждого бронирования не должны быть отсортированы внутри, но если это возможно, это было бы отлично.
Поэтому, когда я делаю дополнительную модификацию данных результата с помощью php, я получаю их в правильном порядке:
foreach ($data as $k => $v)
{
foreach ($data[$k]['items'] as $key => $val)
{
$tmp = explode('~.~', $val);
if (isset($tmp[1]))
{
$tmp[1] = date($this->option_arr['o_datetime_format'], strtotime($tmp[1]));
$data[$k]['items'][$key] = join("~.~", $tmp);
}
}
$data[$k]['total_formated'] = Util::formatCurrencySign(number_format($v['booking_total'], 2), $this->option_arr['o_currency']);
}
Таким образом, цель здесь состоит в том, чтобы не использовать php, как сортировку нескольких массивов, если это возможно, или использовать минимальный php, если это необходимо.
Спасибо.
Задача ещё не решена.
Других решений пока нет …