通过时间戳与GROUP_CONCAT和CONCAT_WS

时间:2016-11-15 09:44:02

标签: php mysql date datetime columnsorting

我想尽可能地逃避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。

谢谢。

0 个答案:

没有答案