我想合并订单的所有项目名称;但是,如果唯一项名称的总数超过一定数目,那么我想在连接名称之前截断每个名称。以下是条件:
如果订单中唯一商品名称的总数少于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
答案 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