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

问题描述 投票:1回答:2

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

如果订单中唯一项目名称的总数小于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个唯一的项目名称,我们将获取名称的全长并将它们连接起来。 (我在上表中包含了项目名称strlen以供说明。)

我试图使用三元条件,但它不起作用。 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
mysql sql
2个回答
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

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                                     |
© www.soinside.com 2019 - 2024. All rights reserved.