2013-01-09 14 views
1

我想加入三張表。爲什麼我的JOIN在我的查詢中增加/可能乘以SUM?

第一張表是transactions其中包含學生已獲得的「積分」的詳細信息。這裏的相關字段是(學生接收點)。

transactions table

第二個表是purchases其中包含學生已購買「獎勵」的細節。這裏的相關字段是Student_IDReward_ID

purchases table

決賽桌是rewards其中詳細購買的獎勵。這裏的相關字段是Reward_ID,Cost_to_User(學生爲每個獎勵支付的價格,用於訂購GROUP_CONCAT函數)和Title

rewards table


我使用的查詢如下:

SELECT 
    t.Recipient_ID AS `ID` , 
    SUM(t.Points) AS `Points Earned`, 
    SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT r.Title ORDER BY r.Cost_to_User DESC SEPARATOR ', '),', ',3) AS `Rewards` 
FROM `transactions` t 
LEFT JOIN `purchases` p 
    ON t.Recipient_ID = p.Student_ID 
LEFT JOIN `rewards` r 
    ON p.Reward_ID = r.Reward_ID 
WHERE t.`Recipient_ID` 
    IN (90128, 90163, 33888, 34240, 137674) 
GROUP BY t.`Recipient_ID` 

出於某種原因,則Points Earned輸出是大大錯誤的。 如果我刪除purchases上的LEFT JOIN,則Points Earned輸出正確

這是發送我的SUM命令瘋狂的聯接是什麼?


編輯:請注意,我需要LEFT JOIN命令,我想顯示所有的學生,包括那些沒有作出任何購買。在post中找到更多詳細信息。


由於提前,

回答

2

的問題是,你是從與加入交易表中獲取多個記錄。您可以在交易表使用子查詢,它應該解決這個問題:

SELECT t.`ID` , 
    t.`Points Earned`, 
    SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT r.Title ORDER BY r.Cost_to_User DESC SEPARATOR ', '),', ',3) AS `Rewards` 
FROM 
(
    select t.Recipient_ID AS `ID`, sum(t.Points) AS `Points Earned` 
    from `transactions` t 
    group by t.Recipient_ID 
) t 
LEFT JOIN `purchases` p 
    ON t.`ID` = p.Student_ID 
LEFT JOIN `rewards` r 
    ON p.Reward_ID = r.Reward_ID 
WHERE t.`ID` 
    IN (90128, 90163, 33888, 34240, 137674) 
GROUP BY t.`ID` 

SQL Fiddle with Demo

奇怪總points的從連接表的到來。由於只有在Recipient_ID = Student_ID上加入表格,如果兩個表格中都有記錄,則會得到笛卡爾數量的結果。因此,如果您在transactions表中有一個學生的3條記錄,並且在purchases表中有3條記錄,則結果將顯示該學生的9條記錄,這會改變總數。

請參閱SQL Fiddle with Demo

+0

你好再bluefeet。感謝您的支持! – dunc

+0

@dunc歡迎您,很高興它現在工作。 – Taryn

1

嘗試INNER JOIN

SELECT 
    t.Recipient_ID AS `ID` , 
    SUM(t.Points) AS `Points Earned`, 
    SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT r.Title ORDER BY r.Cost_to_User DESC SEPARATOR ', '),', ',3) AS `Rewards` 
FROM `transactions` t 
LEFT JOIN `purchases` p 
ON t.Recipient_ID = p.Student_ID 
INNER JOIN `rewards` r 
ON p.Reward_ID = r.Reward_ID 
WHERE t.`Recipient_ID` 
IN (90128, 90163, 33888, 34240, 137674) 
GROUP BY t.`Recipient_ID` 
+0

嗨goodmood。感謝您的努力。 'INNER JOIN'沒有任何區別。我還會更新我原來的帖子,以包含我之前提到的一個問題的鏈接,因爲我需要'LEFT JOIN'來包含尚未進行任何購買的學生。 – dunc

+0

然後獎勵這將是內部加入,更新我的回答 –

+0

感謝你的 - 但輸出保持不變,'點贏得'輸出仍然是不正確的恐怕。 – dunc

相關問題