在n:m关系表中选择

时间:2014-02-05 12:35:35

标签: mysql sql

我有2个表和一个n:m关系表,如下所示:

tb_1
-----
id_1
1
2
3

tb_2
-----
id_2
10
11
12

tb_nm
-------
id_1   id_2
 1      10
 1      11
 2      10
 3      10

我想只选择tb_nm行中的id_1,其中id_2 = 10 AND 20 .. 换句话说......在那种情况下,我想只返回id_1 = 1,因为它是id_2 = 10和11的唯一。

我试过了:

SELECT 
    id_1 
FROM
    tb_nm
WHERE
    id_2 = 10
    AND id_2 = 11

它返回零行。

我也试过这个:

SELECT 
    id_1 
FROM
    tb_nm
WHERE
    id_2 IN (10,11)

并返回所有行... 有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我喜欢使用聚合和having子句来解决这些问题。这是表达这些条件的非常灵活的方式。

针对您的具体情况:

select id_1
from tb_nm
group by id_1
having sum(id_2 = 10) > 0 and
       sum(id_2 = 11) > 0;

having子句中的每个条件都计算其中一个条件为真的每组id_1值中的行数。

如果你想添加另一个条件,那就很容易了。例如,如果您希望结果中没有12 s,那就是另一个条件。计算具有该值的行数,并检查以确保没有:

having sum(id_2 = 10) > 0 and
       sum(id_2 = 11) > 0 and
       sum(id_2 = 12) = 0;

答案 1 :(得分:0)

SELECT tt.id_1 
FROM tb_nm tt
WHERE tt.id_2 = 10
AND EXISTS (
    SELECT *
    FROM tb_nm ex
    WHERE ex.id_1 = tt.id_1
    AND ex.id_2 = 11
    );