我想尽可能地逃避php编码,所以我在php中有以下MySQL查询:
$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
所以多个预订服务的日期无论在哪一天,他们都需要从最新(最大)时间戳到最低(最小)时间戳排序,而另一方面也是如此。
现在我得到的结果如下:
售票:
User2的Service2 - 2016-11-17 20:00
User1的Service2 - 2016-11-16 11:00
User1的Service1 - 2016-11-16 09:00
售票:
User2的Service1 - 2016-11-30 12:00
售票:
User2的Service2 - 2016-12-10 11:00
User1的Service1 - 2016-12-09 09:00
售票:
User1的Service2 - 2016-11-28 08:15
,结果应该是(最好以DESC顺序):
售票:
User2的Service2 - 2016-12-10 11:00
User1的Service1 - 2016-12-09 09:00
售票:
User2的Service1 - 2016-11-30 12:00
售票:
User1的Service2 - 2016-11-28 08:15
售票:
User1的Service1 - 2016-11-16 09:00
User1的Service2 - 2016-11-16 11:00
User2的Service2 - 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。
谢谢。