1

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

4

4 回答 4

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
于 2012-08-20T15:10:04.553 回答
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
    )
于 2012-08-20T15:10:20.360 回答
1

假设:产品可以是存在的类别、不存在的类别或根本没有类别的一部分。您根本没有要求不属于任何类别的产品,因此从 product 到 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 category c ON p2c.category_id = c.category_id

    其中 c.category_id 为 NULL

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

  1. NOT IN 子句

    选择 p.*, p2c.category_id

    来自产品 p

    INNER JOIN product_to_category p2c ON (p.product_id = p2c.product_id)

    WHERE p2c.category_id NOT IN(从类别 c 中选择 c.category_id)

于 2012-08-20T15:36:01.407 回答
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.

尝试这个?

于 2012-08-20T15:09:34.977 回答