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;