用 WHERE 子句连接两个表,有两个条件但没有条件

时间:2021-03-12 13:59:12

标签: mysql sql

所以我想通过这两个表获取所有具有频段 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,因为它是一个联合表。

在尝试了很多东西之后,我现在很无知。

4 个答案:

答案 0 :(得分:2)

使用聚合:

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;

答案 1 :(得分: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

答案 2 :(得分:0)

或者使用内部查询

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));

答案 3 :(得分:0)

select b.antena_id, * from antena a
right outer join bands b on a.id = b.antena_id 
where b.band not in (1500, 2500)
    and b.band in (800, 900)

enter image description here

相关问题