2012-01-05 64 views
0

我目前有兩個表,一個是產品,另一個是選項(顏色,大小等)。 如果產品沒有指定任何選項,它把股票對產品表 否則就會把股票對期權表MySQL查詢 - 添加列和行

表看起來有點像這樣:

產品表: 產品ID,名稱,SKU,股票

選項表: optionid,產品ID,SKU,股票

我想從兩個表中提取數據,並增加了「股票」

到目前爲止,我有這樣的:

SELECT `product`.`productid`, `product`.`name`, `product`.`sku`, 

(SUM(`product`.`stock`)) + (SUM(`option`.`stock`)) AS `stock` 

FROM `product` 

LEFT JOIN `option` ON `product`.`productid` = `option`.`productid` 

GROUP BY `productid` 

它顯示的數據我怎麼想,但問題是與股票。 對於具有指定選項的產品,它會很好地添加它們。 如果產品沒有一個選項,它只是顯示 「NULL」

結果enter image description here

回答

0
SELECT `product`.`productid`, `product`.`name`, `product`.`sku`, 

IFNULL(SUM(`product`.`stock`),0) + IFNULL(SUM(`option`.`stock`),0) AS `stock` 

FROM `product` 

LEFT JOIN `option` ON `product`.`productid` = `option`.`productid` 

GROUP BY `productid` 
+0

這效果很好。謝謝! – 2012-01-05 13:20:38

0

嘗試着這樣一句話:

SELECT `product`.`productid`, `product`.`name`, `product`.`sku`, 

IF(`option`.`stock`, SUM(`option`.`stock`), SUM(`product`.`stock`)) AS `stock` 

FROM `product` 

LEFT JOIN `option` ON `product`.`productid` = `option`.`productid` 

GROUP BY `productid` 

我已經把IF條件的選擇。 已編輯!總結option.stock(如果可用)

+0

它似乎忽略加入將我的股票從期權表中刪除。 – 2012-01-05 13:20:45

1

要處理NULL問題,您需要將SUM包裝在COALESCE中。

SUM(`product`.`stock`) + COALESCE(SUM(`option`.`stock`), 0) AS `stock` 

這是因爲SUM(NULL)產生NULL,和x + NULL = NULL。使用COALESCE將NULL更改爲0,給出x + 0,其等於x


我還可以看到一個潛在的問題。

如果一個產品可以有多個選項,則左連接將導致產品記錄中的重複,人爲地誇大您的庫存數量。

例如...

product id stock | option id stock 
    1   5   1   1 
    1   5   2   2 
    2   7   3   1 
    2   7   4   2 
    2   7   5   3 

雖然產品1的庫存是5,加入使它看起來像10和用於產品2,其具有7的庫存,它看起來像21.


解決方法是單獨爲選項GROUP BY。

SELECT 
    `product`.`productid`, 
    `product`.`name`, 
    `product`.`sku`, 
    `product`.`stock` + COALESCE(`option`.`stock`, 0) AS `stock` 
FROM 
    `product` 
LEFT JOIN 
    (SELECT `productid`, SUM(`stock`) AS stock FROM `option` GROUP BY `productid`) as `option` 
    ON `option`.`productid` = `product`.`productid` 
+0

似乎沒有得到這個工作。 – 2012-01-05 13:21:04

+0

我複製了你所說的,並且接受的答案沒有重複庫存水平。只要對產品指定了選項,產品庫存就被設置爲零並被禁用。所以這不應該是一個問題。 – 2012-01-05 13:28:28

0

試試這個:

SELECT `product`.`productid`, `product`.`name`, `product`.`sku`, 

(SUM(`product`.`stock`)) + (CASE WHEN `option`.`stock` = NULL THEN 0 ELSE SUM(`option`.`stock`)) AS `stock` 

FROM `product` 

LEFT JOIN `option` ON `product`.`productid` = `option`.`productid` 

GROUP BY `productid` 

的問題是,當你嘗試添加NULL結果是NULL

+0

#1064 - 您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'EKSE SUM('option'.'stock''))附近使用正確的語法)在第3行的AS''stock' FROM'product' LEFT JOIN'option' ON'' – 2012-01-05 13:22:16

+0

@Rozée謝謝,我編輯過。 – 2012-01-05 13:25:57

0

的另一種方法:

select `productid`, `name`, `sku`, sum(`stock`) `stock` 
from (select `productid`, `name`, `sku`, `stock` FROM `product` 
     union all 
     select `productid`, '' `name`, '' `sku`, `stock` FROM `option`) v 
GROUP BY `productid`