我有三个表,产品,类别和product_to_category。产品具有主键product_id,类别category_id和product_to_category p2c_id。 Product_to_类别使用各自的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不在类别表中。我可能完全走错了路,但我被卡住了! 提前谢谢。
答案 0 :(得分:1)
如果您正在寻找不存在类别的产品,我建议
Select p.*,p2c.category_id
from product p
join product_to_category p2c
on p.product_id=p2c.product_id
left outer join category c
on p2c.category_id=c.category_id
where c.category_id is null
答案 1 :(得分:1)
SELECT p.*
FROM product AS p
LEFT JOIN product_to_category AS p2c ON p.product_id = p2c.product_id
WHERE NOT EXISTS (
SELECT 1
FROM category c
WHERE c.category_id = p2c.category_id
)
答案 2 :(得分:1)
假设:产品可以是存在的类别,不存在的类别或根本没有类别的一部分。您还没有要求产品根本不属于任何类别,因此从产品到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 IS NULL
null测试将找到不匹配的记录。
NOT IN子句
SELECT p。*,p2c.category_id
FROM product p
INNER JOIN product_to_category p2c ON(p.product_id = p2c.product_id)
WHERE p2c.category_id NOT IN(SELECT c.category_id FROM category c)
答案 3 :(得分:0)
SELECT *
FROM product AS p
JOIN product_to_category AS p2c ON p.product_id = p2c.product_id
JOIN category AS c ON c.category_id != as.category.
试试这个?