我有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的项目中选择行
我该怎么做?
答案 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。