验证INNER JOIN中的所有行都有值

时间:2015-05-25 08:57:02

标签: mysql join

我在table1.idtable2.parent_id之间有一对多的表格关系,并希望根据table1.id选择table2.status

SELECT table1.id FROM table1
    INNER JOIN table2 ON table2.parent_id = table1.id
WHERE table2.status = 1

如果table2中只有一个关系,那么这就是我想要的。但是,如果table2中有更多行,则一个结果可能有status=1但另一个结果有status=2

我想要的是仅当table1.id的所有结果都是table2时才能获得status=1 的结果。

实施例

table1
    id=1, name=row1
    id=2, name=row2

table2
    id=1, parent_id=1, status=1
    id=2, parent_id=1, status=2
    id=3, parent_id=2, status=1
    id=4, parent_id=2, status=1

在上面的例子中,table1.id = 1有两个不同状态的关系,我不想要这一行。 table1.id = 2与同一status=1有2个关系,我想要这个结果。

1 个答案:

答案 0 :(得分:0)

您可以使用EXISTSNOT EXISTS来检查其他表格中的值。

此查询选择Table1中具有表2中匹配记录的所有行,但这些行的状态均不等于1。

SELECT *
FROM   Table1 t1
WHERE -- Check for matching records in Table2.
      EXISTS
         (SELECT 'x' FROM Table2 t2 
          WHERE t2.parent_id = t1.id)
      -- Skip rows that have a status different than 1.
      AND NOT EXISTS
         (SELECT 'x' FROM Table2 t2 
          WHERE t2.parent_id = t1.id
          AND t2.status <> 1)

如果表2中根本没有状态,我不确定你想拥有什么。如果要从Table1返回表2中没有任何匹配行的行,则可以省略第一个EXIST <subselect>部分。