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')
请帮助 如何在没有子查询的情况下重写此查询。
三江源
答案 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类别组成的一组数据。然后它加入一组包含所有产品和类别的数据,这些数据将排除那些不共享至少一个类别的产品。