PHP MySQL пользовательский запрос заказа по отметке времени с GROUP_CONCAT и CONCAT_WS

Я хочу как можно больше избежать 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:00

Service1 от пользователя2 —
2016-11-30 12:00

Service2 от пользователя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:00

Service1 от пользователя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:00

Service2 от пользователя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, если это необходимо.

Спасибо.

0

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector