2013-06-11 44 views
0

我很困惑如何獲得每個項目的購買數量加入3個表,從2個表(MYSQL)的SUM()值

SELECT item_id, item_name, sum(backing_status) purchase_count, sum(vote) vote_count 
FROM Items 
LEFT JOIN Purchases ON Items.item_id=Purchases.item_id 
LEFT JOIN Votes ON Items.item_id=Votes.item_id 
where purchase_status='bought' 
group by Items.item_id 

Table Items 
item_id item_name 
1   item_1 
2   item_2 
3   item_3 

Table Purchases 
item_id purchase_status 
1   bought   
2   bought   
1   bought   

Table Votes 
item_id vote 
1   1   
2   1   
3   -1   
1   -1 
1   -1 

期望的輸出是:

做兩簡單連接來連接以下3代表由條目在Votes表中的號碼相乘purchase_count

item_id item_name purchase_count vote_count 
1   item_1  2   -1 //sum of -2 downvotes + 1 upvote 
2   item_2  1   1 
3   item_3  0   -1 

我可能需要子查詢,但不能完全弄清楚查詢。或者,還有更好的方法?

+0

你可能只想做2個查詢。 – Kevin

+0

@凱文謝謝,你說這是因爲性能原因還是更容易代碼/數據庫維護? –

+2

@timpeterson兩者。在一個查詢中這樣做需要使用2個「子查詢」。子查詢知道速度較慢,加上使用它們通常會讓你的sql代碼難以閱讀。國際海事組織,它會更容易做一個'選擇總和(票)從票'和'選擇計數(item_id)從採購'。 – tftd

回答

1

您應該可以使用下面的代碼,它使用子查詢既聚集到得到結果:

select i.item_id, 
    i.item_name, 
    coalesce(p.TotalBought, 0)TotalBought, 
    coalesce(v.vote_count, 0) vote_count 
from items i 
left join 
(
    select item_id, count(*) TotalBought 
    from purchases 
    where purchase_status = 'bought' 
    group by item_id 
) p 
    on i.item_id = p.item_id 
left join 
(
    select item_id, sum(vote) vote_count 
    from votes 
    group by item_id 
) v 
    on i.item_id = v.item_id; 

SQL Fiddle with Demo

你也寫這個沒有兩個子查詢,但你將需要安置的purchase_status的WHERE過濾器的JOIN:

select i.item_id, 
    i.item_name, 
    count(p.item_id) TotalBought, 
    coalesce(v.vote_count, 0) vote_count 
from items i 
left join purchases p 
    on i.item_id = p.item_id 
left join 
(
    select item_id, sum(vote) vote_count 
    from votes 
    group by item_id 
) v 
    on i.item_id = v.item_id 
group by i.item_id, i.item_name; 

SQL Fiddle with Demo

+0

- @ bluefeet,真棒,謝謝,我從來沒有用過'coalesce()'我需要了解這個 –

+1

@timpeterson'coalesce'用你想替換的0或任何值替換null它與。 – Taryn

0
SELECT item_id, item_name, sum(backing_status) AS purchase_count, SUM(vote) 
    AS vote_count 
FROM Items i 
LEFT JOIN Purchases p on i.item_id = p.item_id 
LEFT JOIN (SELECT SUM(vote), item_id FROM votes GROUP BY item_id) AS grv 
    on grv.item_id = i.item_id 
WHERE purchase_status='bought';