2014-03-05 63 views
1

我想列出每個客戶購買的產品,但如果他們在不同的場合買了相同的項目,我希望它排除它。這是我到目前爲止有:選擇不同的左加入只有一列

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

基本上我只需要一個產品上市一次,如果他們已經購買了它,不管多少次他們已經購買了它。我將如何做到這一點?

+0

你想讓你的結果看起來像什麼?另外,最佳做法是將SELECT子句中的每個列的GROUP BY都不包含聚合函數。 – AgRizzo

+0

你的屏幕截圖是如何丟失電子郵件列和其他人的? – MatBailie

+0

由於數據庫已滿,我不想拍攝出一堆電子郵件地址。 – nick

回答

2

可以在GROUP_CONCAT函數中使用DISTINCT,使用Group_concat baware的事實它有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_包。在運行時更改 group_concat_max_len的值的語法如下,其中val是一個無符號整數 :

SET [GLOBAL | SESSION] group_concat_max_len = val;

+1

謝謝,我沒有意識到我可以在group_concat中使用不同的內容 – nick

0

正如你可以select關鍵字後使用distinct,你也可以用它聚合函數(包括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 
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)中包含一些左連接。