MySQL查询条件基于字段值或左连接值

时间:2014-02-08 01:33:09

标签: mysql

在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

1 个答案:

答案 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,以获得不同的列表。

此外,这只关注直接的孩子;它不希望看到孙子(孩子的孩子)是否有价格。