在MySQL中,我有3个名为“product”,“product_group”和“product_category”的表
产品可以通过“product_group”表相互关联。
产品可以通过“product_category”表格显示在特定类别中。
我想要做的是检索特定类别的所有产品,这些产品要么有价格,要么包含一个或多个有价格的子产品。
以下是表格的示例:
product
=======
product_id price
1 10.00
2 20.00
3 0.00
4 40.00
5 50.00
6 0.00
7 0.00
8 0.00
9 0.00
10 0.00
11 1.99
product_group
=============
product_id child_product_id
6 1
6 2
7 3
7 4
8 9
product_category
================
category_id product_id
1 5
1 6
1 7
1 8
1 10
2 11
这意味着产品1和产品2是产品6的子产品。产品3和4是产品7的子产品。产品9是产品8的子产品。
产品5,6,7,8和10属于第1类。
我想要的是一个查询,以返回类别1中具有价格或包含一个或多个有价格的子项的所有产品。所以我希望得到产品5,6,7。虽然产品8和10属于第1类,但我不想要这些,因为它们没有价格,而且它们不包含有价格的儿童。 / p>
到目前为止,我可以使用内部和左侧连接的组合发布我写的查询,但我担心这是完全错误的。
感谢您的关注。
*编辑 *
我发现原始查询确实有效,我将两列中的数据混合在一起。以下是我的原始查询:
SELECT p.product_id
FROM product p
JOIN product_category c
ON c.product_id = p.product_id
AND c.category_id = 1
LEFT
JOIN product_group g
ON p.product_id = g.product_id
LEFT
JOIN product AS p2
ON p2.product_id = g.child_product_id
AND p2.price > 0
WHERE p.price > 0 OR p2.product_id IS NOT NULL
GROUP BY p.product_id
答案 0 :(得分:1)
我会这样做:
SELECT p.product_id
FROM product p
JOIN product_category c
ON c.product_id = p.product_id
AND c.category_id = 1
LEFT
JOIN ( SELECT g.product_id
FROM product_group g
JOIN product h
ON h.product_id = g.child_product_id
AND h.price > 0.00
GROUP BY g.product_id
) r
ON r.product_id = p.product_id
WHERE p.price > 0
OR r.product_id IS NOT NULL
注意:
JOIN to product_category为我们提供了产品必须属于第1类的限制。
内联视图(派生表别名为r)为我们提供了一个“parent”product_id列表,其中包含有价格的child_product_id。
我们将其设为OUTER连接,因此我们仍然可以获得类别1中的所有行,我们只是进行匹配。
在WHERE子句中,我们过滤掉行,只保留那些有价格的产品,或者在内联视图中保留匹配行的产品。
这只是一种方法,有几种方法可以获得等效的结果集。
这假设product_id在产品表中是唯一的。
这也假设(category_id,product_id)元组在product_category表中是唯一的,也就是说,不会有重复,例如, (1,5),(1,5)。如果该假设无效,那么我们可能希望在查询结尾添加GROUP BY p.product_id,以获得不同的列表。
此外,这只关注直接的孩子;它不希望看到孙子(孩子的孩子)是否有价格。