根据结果​​数量截断并连接mysql结果

时间:2019-03-28 13:31:49

标签: mysql sql

我想合并订单的所有项目名称;但是,如果唯一项名称的总数超过一定数目,那么我想在连接名称之前截断每个名称。以下是条件:

如果订单中唯一商品名称的总数少于5,则使用完整商品名称并连接名称;否则,如果唯一项目名称的总数大于5,则将每个项目名称截断为20个字符,然后将截断的名称连接起来。例如,下面是我的桌子:

order_id | item_name                           | item_name_len
---------|-------------------------------------|--------------   
1        | "pampers diapers ultra sensitive"   | 31  
1        | "cabbage salad pure organic greens" | 33
1        | "milky way"                         | 9
1        | "sea salt"                          | 8
1        | "cool waters fruit juice"           | 23
         |                                     |
2        | "pure clear glass crystals"         | 25
2        | "simple sugar edible paper"         | 25

我想要以下结果:

order_id | all_item_names                           
---------|-----------------------------------------------------------
1        | "pampers diapers ultr ; cabbage salad pure o ; milky way ; 
         | sea salt ; cool waters fruit ju"
         |
2        | "pure clear glass crystals ; simple sugar edible paper"

对于订单1,由于订单中有5个唯一的商品名称,因此我们将每个商品名称截断为20个字符,然后将截断的名称连接起来。对于订单2,由于订单中只有2个唯一的商品名称,因此我们采用名称的全长并将其连接起来。 (为说明起见,我已在上表中添加了拼写的商品名称。)

我正在尝试使用三元条件,但是它不起作用。
IF( COUNT(DISTINCT item_name) < 5, item_name, SUBSTRING(item_name, 1, 20) )

请参阅下面的查询。我得到Error code: 1111. Invalid use of group function

SELECT
  w.order_id,
  (SELECT GROUP_CONCAT(  IF ( COUNT(DISTINCT o.item_name) < 5 , 
     o.item_name, SUBSTRING(o.item_name, 1, 20) ) ) separator ' ; ' )
    FROM order_items o WHERE o.order_id = w.order_id)AS all_item_names

FROM order_items w
GROUP BY order_id

2 个答案:

答案 0 :(得分:1)

分组一次以获取项目数,然后加入表以获取最终的group_concat:

select 
  o.order_id,
  group_concat(
    case 
      when counter < 5 then item_name
      else left(item_name, 20)
    end SEPARATOR ' ; '
  ) all_item_names 
from order_items o inner join (
  select
    order_id, count(*) counter
  from order_items
  group by order_id
) g on g.order_id = o.order_id
group by o.order_id

请参见demo
结果:

| order_id | all_item_names                                                                            |
| -------- | ----------------------------------------------------------------------------------------- |
| 1        | pampers diapers ultr ; cabbage salad pure o ; milky way ; sea salt ; cool waters fruit ju |
| 2        | pure clear glass crystals ; simple sugar edible paper                                     |

答案 1 :(得分:1)

您可以通过一次汇总而不使用join来做到这一点:

select oi.order_id,
       (case when count(*) < 5
             then group_concat(oi.item_name separator '; ')
             else group_concat(left(oi.item_name, 20) separator ';')
        end) as all_item_names
from order_items oi
group by oi.order_id