[英]Join two tables with WHERE clause with two conditions and not having a condition
所以我想通过这两个表获得所有具有频段 800 和频段 900 并且没有频段 1500 和没有频段 2500 的天线:
表天线:
id
-------------
antena_1
antena_2
antena_3
antena_4
antena_5
表带:
antena_id band
--------------------------
antena_1 800
antena_1 900
antena_1 1500
antena_1 2500
antena_2 800
antena_2 900
antena_2 1500
antena_3 800
antena_3 900
antena_3 1500
antena_3 2500
antena_4 800
antena_4 900
antena_5 800
antena_5 1500
antena_6 800
antena_7 800
antena_7 900
antena_7 3500
所以查询必须返回天线:antena_4 和 antena_7
我已经尝试过了,但它确实返回了没有 1500 个频段的天线:
SELECT * FROM antenas INNER JOIN bands ON antenas.id = bands.antena_id WHERE
NOT EXISTS (
SELECT antena_id FROM bands AS innerBands
WHERE innerBands.antena_id = antenas.id AND (
bands.band = "1500" OR bands.band = "2500"
)
)
AND band = "800" AND band = "900"
GROUP BY antenas.id
ORDER BY antenas.id ASC
我想知道 NOT EXISTS 是否在 WHERE 中做任何事情,我想我可能不得不使用 HAVING,因为它是一个联合表。
在尝试了很多东西之后,我现在很茫然。
使用聚合:
select antenna_id
from bands
group by antenna_id
having sum(band = 800) > 0 and
sum(band = 900) > 0 and
sum(band = 1500) = 0 and
sum(band = 2500) = 0;
你可以做:
select a.antena_id
from bands a
join bands b on b.antena_id = a.antena_id and b.band = 900
left join bands c on c.antena_id = a.antena_id and c.band = 1500
left join bands d on d.antena_id = a.antena_id and d.band = 1500
where a.band = 800
and c.antena_id is null
and d.antena_id is null
或者使用内部查询
SELECT distinct(antenna_id)
FROM bands
WHERE
band in (800, 900)
AND antenna_id NOT IN (select antenna_id from bands where band in (1500, 2500));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.