我正在尝试列出每个客户购买的产品,但如果他们在不同的场合购买了相同的商品,我希望将其排除在外。这就是我到目前为止所做的:
Select c.field_id_33 AS email, o.order_id, Group_concat(o.entry_id) AS Products,group_concat(t.title),group_concat(t.url_title) from finn_cartthrob_order_items o
LEFT JOIN finn_channel_data c
ON c.entry_id=o.order_id
LEFT JOIN finn_channel_titles t
ON o.entry_id=t.entry_id
GROUP BY email
这产生了:
基本上,如果他们购买了产品,我只需要一次列出产品,无论他们购买了多少次。我该怎么做?
答案 0 :(得分:2)
你可以在group_concat函数中使用DISTINCT
,使用Group_concat明确它的默认限制为1024个字符来对它们进行分组但是可以增加
Select c.field_id_33 AS email, o.order_id,
Group_concat(DISTINCT o.entry_id) AS Products,
group_concat(DISTINCT t.title),
group_concat(DISTINCT t.url_title)
from finn_cartthrob_order_items o
LEFT JOIN finn_channel_data c
ON c.entry_id=o.order_id
LEFT JOIN finn_channel_titles t
ON o.entry_id=t.entry_id
GROUP BY email
从文档中将结果截断为最大长度 由group_concat_max_len系统变量给出,该变量具有默认值 值为1024.该值可以设置得更高,虽然有效 返回值的最大长度受值的约束 max_allowed_packet的。更改值的语法 group_concat_max_len在运行时如下,其中val是一个 无符号整数:
SET [GLOBAL | SESSION] group_concat_max_len = val;
答案 1 :(得分:0)
正如您可以在distinct
关键字后使用select
一样,您也可以在聚合函数(包括group_concat
)中使用它,只聚合每个不同的值一次:
Select
c.field_id_33 AS email, o.order_id,
Group_concat(DISTINCT o.entry_id) AS Products,
group_concat(DISTINCT t.title),
group_concat(DISTINCT t.url_title)
from finn_cartthrob_order_items o
LEFT JOIN finn_channel_data c
ON c.entry_id=o.order_id
LEFT JOIN finn_channel_titles t
ON o.entry_id=t.entry_id
GROUP BY email
答案 2 :(得分:0)
您是否考虑过使用ROW_NUMBER而不是PARTITION BY?
以下是一个示例。
SELECT *
FROM (SELECT order_id,
entry_id,
ROW_NUMBER() OVER (PARTITION BY entry_id
ORDER BY entry_id) AS ProductCount
FROM finn_cartthrob_order_items
) AS Products
WHERE ProductCount = 1
ORDER BY Products.order_id
这应该返回每个entry_id的第一个order_id和entry_id。它在概念上与此类似。
SELECT TOP 1 *
FROM finn_cartthrob_order_items
WHERE entry_id = @Specific_entry_id
您可能需要在Over(Partition By)中包含一些左连接。