【问题标题】:Select distinct on Left Join for only one column只为一列选择左连接上的不同
【发布时间】:2014-03-05 19:52:55
【问题描述】:

我正在尝试列出每个客户购买的产品,但如果他们在不同的场合购买了相同的商品,我希望它排除它。这是我目前所拥有的:

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

这正在生产:

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

【问题讨论】:

  • 您希望您的结果是什么样的?此外,最佳做法是对 SELECT 子句中不涉及聚合函数的每一列进行 GROUP BY。
  • 您的屏幕截图为什么缺少电子邮件栏和其他栏?
  • 因为数据库已经满了,我不想用photoshop把一堆电子邮件地址弄出来。

标签: mysql sql


【解决方案1】:

您可以在 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。该值可以设置得更高,虽然有效 返回值的最大长度受值的约束 最大允许数据包。改变值的语法 运行时的 group_concat_max_len 如下,其中 val 是 无符号整数:

设置 [全局 |会话] group_concat_max_len = val;

【讨论】:

  • 谢谢,我没有意识到我可以在 group_concat 中使用 distinct
【解决方案2】:

正如您可以在 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

【讨论】:

    【解决方案3】:

    您是否考虑过使用 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) 中包含一些左连接。

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 2018-09-16
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2013-10-11
      • 2015-06-19
      • 2015-07-12
      • 2018-03-30
      相关资源
      最近更新 更多