【问题标题】:SQL 'Not in' query involving three tables涉及三个表的 SQL“不在”查询
【发布时间】:2012-08-15 22:22:26
【问题描述】:

我有三个表,product、category 和 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 表中。我可能完全走错了路,但被卡住了! 提前致谢。

【问题讨论】:

    标签: mysql join


    【解决方案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 的测试将找到不匹配的记录。

    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)

    【讨论】:

      【解决方案2】:

      如果您正在寻找不存在的类别的产品,我建议您

      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
      

      【讨论】:

        【解决方案3】:
           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
            )
        

        【讨论】:

          【解决方案4】:
          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.
          

          试试这个?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多