mysql查询,以获取一列在不同组中多次出现并匹配特定条件的所有结果

qlckcl4x  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(380)

假设我有以下数据:

object    size    color    units
------    ----    -----    -----
ball      small   red      3
ball      small   red      2
ball      medium  blue     2
ball      medium  blue     1
ball      big     yellow   2
hat       big     green    3
hat       big     green    4
umbrella  medium  blue     1
umbrella  medium  blue     4
umbrella  big     blue     4
umbrella  huge    red      2
umbrella  huge    green    1
book      small   white    4
book      small   brown    3
book      medium  brown    2

我需要一个查询,该查询返回所有对象的所有对象颜色大小变化,其中至少有一个变化的大小和颜色的总单位至少为5,因此该查询将返回以下行:

object    size    color    total_units
------    ----    -----    ------
ball      small   red      5
ball      medium  blue     3
ball      big     yellow   2
umbrella  medium  blue     5
umbrella  big     blue     4
umbrella  huge    red      2
umbrella  huge    green    1

结果中显示所有球及其每种尺寸颜色变化的总数的原因是,至少有两个不同的球,其中至少一个球的总单位为5或更多
结果中出现所有雨伞及其每种尺寸的总颜色变化的原因是,至少有两种不同的雨伞,其中至少一种雨伞的总单位为5或更多
这个帽子没有出现在结果中的原因是,尽管有超过5个单位(7个)的绿色大帽子,但至少没有两个不同的帽子
没有一本书出现在结果中的原因是,尽管有3本不同的书,但其中至少没有5个单元。
谢谢你向我展示了如何做到这一点!

evrscar2

evrscar21#

在派生表中,我们可以确定 Object 值,该值至少有一个以上的组合,并且其中一个组合至少总共有5个单位。
联接回主表以仅获取这些行(post GROUP BY ).
查询

SELECT 
  t.object, t.size, t.color, SUM(t.units) AS total_units 
FROM 
your_table AS t
JOIN 
(
  SELECT dt.object 
  FROM 
  (
    SELECT
      object, size, color, SUM(units) AS total_units 
    FROM your_table 
    GROUP BY 
      object, size, color
  ) AS dt 
  GROUP BY dt.object 
  HAVING COUNT(*) > 1 AND 
         SUM(dt.total_units >= 5) /* atleast one with 5 units */
) AS dt2 
  ON dt2.object = t.object
GROUP BY t.object, t.size, t.color;

结果

| object   | size   | color  | total_units |
| -------- | ------ | ------ | ----------- |
| ball     | big    | yellow | 2           |
| ball     | medium | blue   | 3           |
| ball     | small  | red    | 5           |
| umbrella | big    | blue   | 4           |
| umbrella | huge   | green  | 1           |
| umbrella | huge   | red    | 2           |
| umbrella | medium | blue   | 5           |

db fiddle视图

jdzmm42g

jdzmm42g2#

使用窗口函数(在mysql和mariadb数据库的最新版本中),这很简单:

select object, size, color, total_units
from (select object, size, color, sum(units) as total_units,
             max(sum(units)) over (partition by object) as max_total_units,
             count(*) over (partition by object) as cnt
      from t
      group by object, size, color
     ) t
where max_total_units >= 5 and cnt > 1;

相关问题