mysql 在基于聚合的表中创建列(不创建另一个表)

bxjv4tth  于 2022-10-31  发布在  Mysql
关注(0)|答案(2)|浏览(130)

我有一个表名为Sets的乐高:
| set_number(主键)|设置名称|其他字段(_F)|
| - -|- -|- -|
| 一百二十三|消防车|abc公司|
| 二百三十四人|星星大战|abc公司|
我有另一个表称为Parts的乐高:
| part_number(主键)|姓名|set_number(从集合中引用set_number)|
| - -|- -|- -|
| 一个|卡车车顶|一百二十三|
| 2个|卡车车身|一百二十三|
| 三个|内墨典总督长袍|二百三十四人|
我想在Sets表格中创建另一列,以指示特定器械包具有的唯一部件的数量。
我可以输出唯一部件的数量,如下所示:

SELECT s.set_number, COUNT(*) AS num_diff_parts
FROM Sets s, Parts p
WHERE p.set_number = s.set_number
GROUP BY s.set_number

这将输出下表(我们称之为results):
| 设置编号|差异部分数|
| - -|- -|
| 一百二十三|2个|
| 二百三十四人|一个|
但是,我想知道是否可以将列(num_diff_parts)作为新列放入Sets表中,而不必在每次需要此信息时都运行此查询,或者创建另一个表来包含results表的内容。
理想情况下,Sets表应如下所示:
| set_number(主键)|设置名称|其他字段(_F)|差异部分数|
| - -|- -|- -|- -|
| 一百二十三|消防车|abc公司|2个|
| 二百三十四人|星星大战|abc公司|一个|
我也尝试过在多个字段上执行GROUP BY,但我认为这样做不安全,因为这些字段可能会有重复,并将抛出结果。

yfjy0ee7

yfjy0ee71#

select  distinct 
        set_number
       ,set_name
       ,other_fields
       ,count(*) over(partition by set_number) as num_diff_parts
from    Sets join Parts using(set_number)

| 设置编号|设置名称|其他字段(_F)|差异部分数|
| - -|- -|- -|- -|
| 一百二十三|消防车|abc公司|2个|
| 二百三十四人|星星大战|abc公司|一个|
我们也可以在加入表之前先count()

with parts_cnt as (
                  select   set_number
                          ,count(*) as num_diff_parts
                  from     Parts
                  group by set_number
                  )
select  *
from    Sets join parts_cnt using(set_number)

Fiddle

wribegjk

wribegjk2#

但是,我想知道是否可以将列(num_diff_parts)作为新列放入Sets表中,而不必在每次需要此信息时都运行此查询
我建议使用视图;使用这种技术,信息总是可用的,并且您不需要自己使其保持最新。
在MySQL中,相关子查询可以方便地高效计算每套零件的数量:

create view v_sets as
select s.*, 
    (
        select count(*)
        from parts p
        where p.set_number = s.set_number
    ) num_diff_parts
from sets s

相关问题