我有三个表,产品,类别和product_to_category . 产品具有主键product_id,类别category_id和product_to_category p2c_id . Product_to_ category使用各自的ID将产品链接到多对多关系中的类别 .
基本上我想编写一个查询,从类别表中不存在的类别中选择所有产品 . 这是因为从另一个数据库迁移了产品 .
我有这样的事情,但有点迷失 .
SELECT *
FROM product AS p
LEFT JOIN product_to_category AS p2c ON p.product_id = p2c.product_id
LEFT JOIN category AS c ON c.category_id
基本上这就是我所拥有的 . 我需要将类别表连接到product_to_category表,其中product_to_category category_id不在类别表中 . 我可能完全走错了路,但我被卡住了!提前致谢 .
4 回答
假设:产品可以是存在的类别,不存在的类别或根本没有类别的一部分 . 您还没有要求产品属于任何类别,因此从产品到procduct_to_category的第一个LEFT JOIN应该是INNER JOIN .
警告:我在mysql生锈,所以我使用的是SQL SERVER语法 . 我忘了如果mysql有ON子句或使用JOIN的where子句 . 如果不支持ON子句,请将它们更改为WHERE子句 .
有两种常见的方法:OUTER JOIN或NOT IN子句(或NOT EXISTS子句,它通常与NOT IN子句的性能相同 . )
选择p . *,p2c.category_id
来自产品p
INNER JOIN product_to_category p2c ON(p.product_id = p2c.product_id)
LEFT JOIN类别c ON p2c.category_id = c.category_id
WHERE c.category_id是NULL
对null的测试将找到不匹配的记录 .
SELECT p . *,p2c.category_id
从产品p
INNER JOIN product_to_category p2c ON(p.product_id = p2c.product_id)
在哪里p2c.category_id NOT IN(SELECT c.category_id FROM category c)
如果您正在寻找不存在的类别的产品,我建议
试试这个?