2012-07-09 65 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