mysql选择id不在

mysql选择id不在,mysql,sql,Mysql,Sql,表工业部门 | industrial_division_id | | ---------------------- | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | 表产品 | product_id | | -------

工业部门

| industrial_division_id | | ---------------------- | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | 表
产品

| product_id | | ---------- | | 2177 | | 2196 | | 2234 | | 2356 | | 2523 | | 2779 | 表
产品\u成员

| product_member_id | product_id | member_id | | ----------------- | ---------- | --------- | | 21997 | 2423 | 19961 | | 21998 | 2424 | 19961 | | 21999 | 2425 | 19961 | | 22000 | 2426 | 19961 | | 22001 | 2427 | 19961 | | 22002 | 2356 | 19961 | | 24504 | 2196 | 21381 | | 24748 | 2205 | 21582 | | 24749 | 2523 | 21582 | | 25116 | 2177 | 21947 | | 28485 | 2356 | 24466 | | 34257 | 2234 | 29168 | | 34271 | 2779 | 29184 | | 34298 | 2779 | 29218 | |产品|成员|成员| id |产品| id |产品|部门|成员|部门| | ----------------- | --------- | ---------- | ---------------- | --------------- | | 22002 | 19961 | 2356 | 5 | 1 | | 24504 | 21381 | 2196 | 6 | 3 | | 24749 | 21582 | 2523 | 6 | 4 | | 25116 | 21947 | 2177 | 6 | 3 | | 28485 | 24466 | 2356 | 1 | 5 |
这看起来像是一个带有聚合的基本
JOIN
查询——但是聚合应该位于正确的级别,我认为这是成员/产品级别。然后可以使用
having
子句进行筛选,而不是
where
子句:

select pm.product_member_id as product_member_id, m.member_id,
       p.product_id, 
       group_concat(idp.industrial_division_id) as product_divisions,
       m.member_division as industrial_division_id
from product_member pm join
     members m
     on pm.member_id = m.member_id join
     industrial_division_product idp
     on ipd.product_id = pm.product_id
group by pm.product_member_id, m.member_division, p.product_id, m.member_id
having sum(m.industrial_division_id = idp.industrial_division_id) = 0;
sum()。因为可以有多个产品部门,所以您只需要不匹配的行

sum()
本身使用的是MySQL捷径。在其他数据库中,它可以写成:

sum(case when m.industrial_division_id = idp.industrial_division_id then 1 else 0 end) = 0;
| product_member_id | member_id | product_id | product_division | member_division | | ----------------- | --------- | ---------- | ---------------- | --------------- | | 22002 | 19961 | 2356 | 5 | 1 | | 24504 | 21381 | 2196 | 6 | 3 | | 24749 | 21582 | 2523 | 6 | 4 | | 25116 | 21947 | 2177 | 6 | 3 | | 28485 | 24466 | 2356 | 1 | 5 |
select pm.product_member_id as product_member_id, m.member_id,
       p.product_id, 
       group_concat(idp.industrial_division_id) as product_divisions,
       m.member_division as industrial_division_id
from product_member pm join
     members m
     on pm.member_id = m.member_id join
     industrial_division_product idp
     on ipd.product_id = pm.product_id
group by pm.product_member_id, m.member_division, p.product_id, m.member_id
having sum(m.industrial_division_id = idp.industrial_division_id) = 0;
sum(case when m.industrial_division_id = idp.industrial_division_id then 1 else 0 end) = 0;