簡體   English   中英

為什么我的JOIN增加/可能在我的查詢中乘以SUM?

[英]Why does my JOIN increase/possibly multiply the SUM in my query?

我正在嘗試加入三張桌子。

第一個表是包含學生已經獲得的“積分”的詳細信息的transactions 這里的相關字段是Recipient_ID (學生接收積分)。

交易表

第二個表是purchases ,其中包含學生購買的“獎勵”的詳細信息。 這里的相關字段是Student_IDReward_ID

購買表

決賽桌是rewards ,詳細說明了所購買的獎勵。 這里的相關字段是Reward_IDCost_to_User (學生為每個用於訂購GROUP_CONCAT功能的獎勵支付的價格)和Title

獎勵表


我正在使用的查詢如下:

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 EarnedPoints Earned輸出是正確的

什么是關於發送我的SUM命令瘋狂的加入?


編輯 :請注意我需要LEFT JOIN命令,因為我想顯示所有學生,包括那些沒有購買的學生。 在這篇文章中找到了更多細節。


提前致謝,

問題是您從連接的事務表中獲取多個記錄。 您可以在事務表上使用子查詢,它應該解決此問題:

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

嘗試使用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`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM