如何在没有子查询的情况下重写此查询

时间:2015-01-29 17:26:18

标签: mysql

SELECT p.*,
       pc.category_id
FROM (product AS p) 
LEFT JOIN product_category AS pc 
  ON p.product_id = pc.product_id
WHERE pc.category_id IN
    (SELECT pc.category_id
     FROM (product AS p)
     LEFT JOIN product_category AS pc 
        ON p.product_id = pc.product_id
     WHERE p.product_id = '4')

请帮助 如何在没有子查询的情况下重写此查询。

三江源

3 个答案:

答案 0 :(得分:1)

将其格式化为更具可读性:

SELECT p.*, pc.category_id 
FROM (product as p) 
LEFT JOIN product_category as pc 
ON p.product_id = pc.product_id 
WHERE pc.category_id IN 
    (SELECT pc.category_id 
     FROM (product as p) 
     LEFT JOIN product_category as pc 
     ON p.product_id = pc.product_id 
     WHERE p.product_id = '4')

答案 1 :(得分:1)

如果我正确理解了查询,它会选择属于包含product_id = 4产品的类别的所有产品(表product_category是产品和类别之间的多对多关系)。

此查询应返回相同的结果集:

SELECT DISTINCT p.*, pc.category_id
FROM product p
    INNER JOIN product_category pc ON pc.product_id = p.product_id
    INNER JOIN product_category p2 ON p2.category_id = pc.category_id
        AND p2.product_id = '4'

工作原理:

它将所有产品p与其所属的类别(pc.category_id)匹配,然后与属于这些类别的其他产品(p2.product_id)匹配(p2.category_id = pc.category_id)并p2.product_id = 4

需要DISTINCT关键字,否则当每个产品与另一个产品共享至少两个类别时,它们将多次出现。共享中涉及的更多产品和类别将更多地增加重复数量。

答案 2 :(得分:1)

假设您需要:与Product_ID 4共享部分或全部产品类别的所有产品的列表

SELECT p.*, PC.category_ID
FROM  Product P
INNER JOIN Product_Category PC
 on P.Product_ID = PC.Product_ID
INNER JOIN PRoduct_Category PC2
 on PC.Product_Category_ID = PC2.Product_Category_ID
 and PC2.Product_Id = 4

这基本上第二次加入产品类别以获得由产品4类别组成的一组数据。然后它加入一组包含所有产品和类别的数据,这些数据将排除那些不共享至少一个类别的产品。