PHP MySQL:从表A获取行,其中表A的列Z的值不在表B的列Z中

时间:2010-07-21 20:00:08

标签: php mysql mysqli

我有2个表项和item_relations

项目有4列row_id(主键),story_id,field1和field2

item_relation存储items表中每行的关系,它有2列parent_story_id和child_story_id。两列都存储了来自items的行的story_id。

父项可以包含多个子项,而子项可以包含一个或多个父项。但是子项目不能有自己的子项目。

现在我想从item_relation.child_story_id中没有items.story_id的项目中选择行

我该怎么做?

1 个答案:

答案 0 :(得分:3)

  

我想从item_relation.child_story_id中没有items.story_id的项目中选择行

你可以使用NOT IN,NOT EXISTS或LEFT JOIN / WHERE ...... IS NULL。

NOT IN的例子:

SELECT *
FROM items
WHERE items.story_id NOT IN (
    SELECT child_story_id FROM item_relation
)

LEFT JOIN / WHERE的示例... IS NULL:

SELECT items.*
FROM items
LEFT JOIN item_relation
ON items.story_id = item_relation.child_story_id
WHERE item_relation.child_story_id IS NULL

NOT EXISTS的例子:

SELECT *
FROM items
WHERE NOT EXISTS (
    SELECT NULL
    FROM item_relation
    WHERE item_relation.child_story_id = items.story_id
)

NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL文章Quassnoi解释了这些技术之间的差异并比较了它们的表现。摘要:

  

这就是为什么在MySQL中搜索缺失值的最佳方法是使用LEFT JOIN / IS NULL或NOT IN而不是NOT EXISTS。