Mysql

按單個成員選擇組並對其他值求和

  • August 31, 2022

使用 MySql 5.7.34 並有一個表 groups_members,有 4 列

我想選擇同時擁有 Bob 和 Joe 作為成員的所有組,並且該組織僅是 Apple,每個組在結果中只有一行。

預期成績:

如果可能的話,理想情況下,我還希望從同一查詢中的另一個表中為每個組選擇和求和一些值。基本上得到所有以 Bob 和 Joe 作為成員的團體,並獲得該團體的綜合積分和里程:

所以理想的預期結果實際上是:

我可以想出一些方法來使用多個查詢和一些應用程序邏輯來做到這一點。但是,如果可以通過一個查詢完成所有操作,那就太好了。

一種可能的方式:

select gm.`group`,SUM(at.points) as points,SUM(at.miles) as miles
from another_table at 
inner join (select `group` 
           from groups_members
           where member in ('Bob','Joe')
           group by `group`
           having count(distinct member) >=2 
           ) as gm on at.`group`=gm.`group`
where not exists (select 1 
                from groups_members g 
                where gm.`group` = g.`group` 
                and organization <> 'Apple')
group by gm.`group`;

注意。我將組織從 更改(2,'A','Susan','Apple'),(2,'A','Susan','Microsoft'),,僅用於測試目的

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=af373d5f67a7f9918b6e441be95723d6

請不要在您的情況下使用MySQL保留字group。如果可能的話,我建議重命名,否則你必須把它放在反引號內。

子查詢只返回group至少有 (‘Bob’,‘Joe’) 的,它也可能是其他的。

where not exists將過濾所有具有組織!=‘Apple’的組。

下面的索引應該有助於優化器加速查詢

alter table `groups_members`  add index `gr_me` (`group`,`member`);
alter table `another_table `  add index `group` (`group`);

引用自:https://dba.stackexchange.com/questions/316304