2012-07-09 66 views
-1

我需要一些帮助和看法。多次使用子查询

我有2个表,我需要“合并”在一起。

第一个表包含有关产品(产品颜色尺寸)信息,以及其他表有大约股票,出售,即时拍摄产品赛季彩大小niveau(数量)等信息。

我需要我的观点返回可用的PR产品。 相同的产品颜色大小可以多次(它可以在多个季节),因此我不能只对可用的ex进行总结。

我的查询看起来像这样

SELECT 
    SUM((
     SELECT 
      SUM(products_details.available) 
     FROM 
      products_details 
     WHERE 
      products_details.product_id = products.id 
    )) AS available 
FROM 
    products 

但是,这是不行的。如果一个大小有6个可用,另一个大小有-5,则查询将返回1可用。但是,我真的有6,我可以卖。

因此,我需要做一些调整

SELECT 
    SUM((
     SELECT 
      SUM(
       IF(
        products_details.available > 0, 
        products_details.available, 
        0 
       ) 
      ) 
     FROM 
      products_details 
     WHERE 
      products_details.product_id = products.id 
    )) AS available 
FROM 
    products 

但是,这也将无法正常工作。如果大小在一个季节有6个可用,另一个为-5,则查询将返回6个可用。但是,我需要总结这两行,因为它是同一个产品。因此它需要返回1可用。

所以,我想出了

SELECT 
    SUM(
     IF(
      (
       SELECT 
        SUM(
         IF(
          products_details.available > 0, 
          products_details.available, 
          0 
         ) 
        ) 
       FROM 
        products_details 
       WHERE 
        products_details.product_id = products.id 
      ) > 0, 
      (
       SELECT 
        SUM(
         IF(
          products_details.available > 0, 
          products_details.available, 
          0 
         ) 
        ) 
       FROM 
        products_details 
       WHERE 
        products_details.product_id = products.id 
      ), 
      0 
     ) 
    ) AS available 
FROM 
    products 

但是,那将是非常(!)慢。我可以多次使用相同的子查询吗?所以我可以在If语句中使用它,如果它是肯定的,我可以使用相同的值来使用总和?

这是非常复杂的,但我希望有人能帮助我

/的Mads

编辑

我才发现,我可以写

SELECT 
    SUM((
     SELECT 
      IF(
       SUM(products_details.available) > 0, 
       SUM(products_details.available), 
       0 
      ) 
     FROM 
      products_details 
     WHERE 
      products_details.product_id = products.id 
    )) AS available 
FROM 
    products 

可以工作好吗

EDIT2

我发现把它写一个新的和更快捷的方式,并且它工作得很好:-)

SELECT 
    SUM(GREATEST(0,(
     SELECT 
      SUM(products_details.available) 
     FROM 
      products_details 
     WHERE 
      products_details.product_id = products.id 
    ))) AS available 
FROM 
    products 
GROUP BY 
    products.id 

这是非常快的 - 从大约10秒至略高于1秒。

回答

1

子查询是不适合这个工作的工具。实际上,在日常SQL查询中,子查询相当罕见。更有用的是JOIN s。

SELECT products.*, SUM(IF(product_details.available > 0, product_details.available, 0)) AS available 
FROM products 
INNER JOIN product_details ON (product_details.product_id = products.id) 
GROUP BY products.id 

这将返回一行对每个产品的所有availability值的跨越products_details所有行该产品的总和。

+0

这是行不通的。 我需要在整个季节SUM(大小可以在多个季节,但我需要它的SUMmed值).. 我很喜欢(!)使用连接(我一直使用它们),但是因为我需要SUM特殊的方式,所以我不能以这种方式使用 – Mads 2012-07-09 12:47:13

+0

啊,我误解了这个限制。你如何识别哪个'product_details'记录是正确的?在你的例子中,一个人有6个,一个人有-5个,我怎么能告诉6是正确的? – VoteyDisciple 2012-07-09 12:51:50

+0

如果我正确读取你的样本,这只是一个消除任何负值的问题,并仍然总结它们。我已经对我的查询做了调整。 – VoteyDisciple 2012-07-09 12:53:07