【问题标题】:MySQL Group by multiple columns where there are duplicate rowsMySQL 按多列分组,其中有重复的行
【发布时间】:2021-07-16 17:00:46
【问题描述】:

我有一个相当简单的架构,有类似的行

我要做的是按name 然后sku 对结果进行分组 - 仅在有重复项的地方。

例如,我的预期结果是

sku1 | Blue T-shirt
sku1 | Dark Blue T-shirt
sku2 | Red T-Shirt
sku2 | Reddish T-shirt

sku3 不会返回,因为它们都具有相同的名称。

我试过了

SELECT
  sku, 
  name, 
  count(*) 
FROM 
  order_items
GROUP BY
  name, 
  sku
HAVING COUNT(*) > 1

但是,这省略了sku2

sku  | name          | count(*)
sku1 | Blue T-shirt  | 3
sku2 | Green T-shirt | 3

count(*) 在这种情况下似乎在分组之前返回总行数。

我有一个关于这个的 SQL 小提琴
http://sqlfiddle.com/#!9/532d37/9

【问题讨论】:

  • 是的,wgat 按两个值分组确实如此,在这方面是正确的
  • and count(*) > 1 表示您的预期结果必须存在 2 个或更多,另外只有一个存在
  • 而你的 dbfiddle 中的 result6 显示 sk1 和 sku3 而不是 sku 2
  • @nbk 修复了有问题的错字,谢谢

标签: mysql group-by


【解决方案1】:

此查询将满足预期结果。

-- MySQL
SELECT c.sku, c.name
FROM order_items c
INNER JOIN (SELECT sku
                 , COUNT(DISTINCT name) dis_cnt
            FROM order_items
            GROUP BY sku
            HAVING COUNT(DISTINCT name) > 1) t
        ON c.sku = t.sku 
GROUP BY c.sku, c.name; 

【讨论】:

    【解决方案2】:

    您可以对同一张表使用 INNER JOIN。

    SELECT
      order_items.sku, 
      order_items.name 
    FROM
      order_items
     INNER JOIN
      (SELECT
      sku, 
      name, 
      count(*) 
    FROM 
      order_items
    GROUP BY
      name, 
      sku
    HAVING COUNT(*) > 1) A
    ON
      order_items.sku = A.sku
    

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2018-03-20
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 2015-03-17
      相关资源
      最近更新 更多