thinkphp中使用group_concat()函数时的排序方法

467 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

数据来自2张表,在之前的帖子里已经写了这获取数据后如何拆分数据

$data = Db::table('hi_project_combo')->alias('A')
        ->leftJoin('hi_project B','B.id=A.pid')
        ->field('B.id,max(B.group_name) group_name,max(B.class_name) class_name,max(B.type) type,max(B.sort) sort,max(B.tags) tags,max(B.is_show) is_show,max(B.summary) summary')
        ->field("GROUP_CONCAT(
          concat_ws('#',
          CONCAT('id=>',A.id),
          CONCAT('pid=>',A.pid),
          CONCAT('title=>',A.title),
          CONCAT('simple_title=>',A.simple_title),
          CONCAT('original_price=>',A.original_price),
          CONCAT('group_price=>',A.group_price),
          CONCAT('price=>',A.price),
          CONCAT('num=>',A.num),
          CONCAT('days=>',A.days),
          CONCAT('unit=>',A.unit)
          ) separator'|') AS group_combo")
         ->group('B.id')
         ->select();

按照上面这个写完实际使用中发现,后添加的数据或者价格低的没有按照我预期的升序排列,以为添加个->order('A.price','ASC')可以升序排列,但是order和group同时出现是没有效果的,包括也尝试了利用子查询,在我这个里面也是没有效果的。

​​ (上面这样不是想要的效果)

$data = Db::table('hi_project_combo')->alias('A')
        ->leftJoin('hi_project B','B.id=A.pid')
        ->field('B.id,max(B.group_name) group_name,max(B.class_name) class_name,max(B.type) type,max(B.sort) sort,max(B.tags) tags,max(B.is_show) is_show,max(B.summary) summary')
        ->field("GROUP_CONCAT(
          concat_ws('#',
          CONCAT('id=>',A.id),
          CONCAT('pid=>',A.pid),
          CONCAT('title=>',A.title),
          CONCAT('simple_title=>',A.simple_title),
          CONCAT('original_price=>',A.original_price),
          CONCAT('group_price=>',A.group_price),
          CONCAT('price=>',A.price),
          CONCAT('num=>',A.num),
          CONCAT('days=>',A.days),
          CONCAT('unit=>',A.unit)
          ) ORDER BY A.price ASC separator'|') AS group_combo")
         ->group('B.id')
         ->select();

​​ (这才是正常想要的效果)