2013-02-19 88 views
7

我有3個表格:商品,商店和圖片。在第一個表格中存儲商品標題。在不同股票中的第二種商品餘額中,在第三種商品圖片中鏈接。所以商品與商店和圖片有一對多的聯繫。 現在,我需要通過一次查詢得到庫存總量和圖片數量的商品清單。 我做了這樣的:左連接,總數和計數組由

SELECT good.id, good.title, sum(store.rest) AS storerest, count(pics.id) AS picscount 
FROM goods 
LEFT JOIN store ON (goods.id = store.goodid) 
LEFT JOIN pics ON (goods.id = pics.goodid) 
GROUP BY goods.id` 

所有似乎確定,同時具有良好的0或1的畫面。但是當它有2次雙打的時候,我不明白爲什麼。 有什麼問題?

+0

如果你刪除了你的GROUP BY子句,你會明白爲什麼sum(store.rest)不是你所期望的。 – Alex 2013-02-19 20:57:29

回答

16

你的問題是,當你有兩個(或更多)store行和兩個(或更多)pics行單個goods行,你最終行的所有組合的產品。

爲了解決這個問題,做你的聚集加盟之前:

SELECT 
    good.id, 
    good.title, 
    IFNULL(s.storerest, 0) AS storerest, 
    IFNULL(p.picscount, 0) AS picscount 
FROM goods 
LEFT JOIN (
    SELECT goodid, sum(rest) AS storerest 
    FROM store 
    GROUP BY goodid 
) s ON (goods.id = s.goodid) 
LEFT JOIN (
    SELECT goodid, count(id) AS picscount 
    FROM pics 
    GROUP BY goodid 
) p ON (goods.id = p.goodid) 
1

首先考慮的加入大小。如果有一張照片有兩張照片,則會有兩倍的照片。其實這些行將被複制,但圖片部分。因此,store.rest的總和會將所有內容都提取兩次。有三張照片,你會得到三倍的輸出。

1

您正在將表'商品'與另外兩個表加在一起,其中這兩個其他表與'商品'表具有一對多關係。當他們被連接時,結果會產生組合 - 所以如果有2張圖片,那麼存儲項目會被列出兩次。

解決這個,如果你先計算出子表的統計,然後你加入他們的行列,計數獨特的項目時要使用不同的計數,因此,例如您查詢確實應該最簡單的方法:

SELECT good.id, good.title, sum_rest AS storerest, count(distinct pics.id) AS picscount 
FROM goods 
LEFT JOIN (select goodid, sum(rest) as sum_rest from store) s ON (goods.id = s.goodid) 
LEFT JOIN pics ON (goods.id = pics.goodid) 
GROUP BY goods.id