SQL'不在'涉及三个表的查询

时间:2012-08-20 15:05:00

标签: mysql join

我有三个表,产品,类别和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不在类别表中。我可能完全走错了路,但我被卡住了! 提前谢谢。

4 个答案:

答案 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子句的性能相同。)

  1. 外部加入

    选择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

  2. null测试将找到不匹配的记录。

    1. 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.

试试这个?