繁体   English   中英

你将如何构造这个SQL查询? (MySQL的)

[英]How would you construct this SQL query? (MySQL)

假设我们有这些表:

产品

product_id
product_name

类别

category_id
category_name

product_in_category

product_in_category_id
product_id
category_id

您如何获得product_in_category表中不属于特定类别的所有产品(无重复项)。

换句话说,例如,所有未分配到类别10的产品。 此外,如果一个产品属于类别1,5和10,则不应该出现结果。

使用LEFT JOIN / IS NULL:

   SELECT p.*
     FROM PRODUCT p
LEFT JOIN PRODUCT_IN_CATEGORY pic ON pic.product_id = p.product_id
                                 AND pic.category_id = 10
    WHERE pic.product_in_category_id IS NULL

使用NOT IN

SELECT p.*
  FROM PRODUCT p
 WHERE p.product_id NOT IN (SELECT pic.product_id
                              FROM PRODUCT_IN_CATEGORY pic
                             WHERE pic.category_id = 10)

使用NOT EXISTS

SELECT p.*
  FROM PRODUCT p
 WHERE NOT EXISTS (SELECT NULL
                     FROM PRODUCT_IN_CATEGORY pic
                    WHERE pic.product_id = p.product_id
                      AND pic.category_id = 10)

哪个最好?

这取决于被比较的列是否可以为空(值可以为NULL)。 如果它们可以为空,那么NOT IN / NOT EXISTS效率更高 如果列不可为空,则LEFT JOIN / IS NULL更有效(仅限MySQL)

SELECT * FROM product_in_category WHERE category_id!=10

还是我错过了什么? 我想我错过了没有重复的部分,看看InSane的更好答案。

SELECT product_id FROM product
LEFT OUTER JOIN product_in_category
ON product.product_id = product_in_category.product_id
WHERE product_in_category.product_id IS NULL
GROUP BY product_id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM