在Left Join上选择distinct,仅适用于一列

时间:2014-03-05 19:52:56

标签: mysql sql

我正在尝试列出每个客户购买的产品,但如果他们在不同的场合购买了相同的商品,我希望将其排除在外。这就是我到目前为止所做的:

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

这产生了:

screenshot

基本上,如果他们购买了产品,我只需要一次列出产品,无论他们购买了多少次。我该怎么做?

3 个答案:

答案 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_pa​​cket的。更改值的语法   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)中包含一些左连接。