2

我正在尝试加入三个表。

第一个表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输出非常错误。如果我删除LEFT JOINon purchasesPoints Earned输出是正确的。

是什么让我的SUM命令发疯了?


编辑:请注意,我需要这些LEFT JOIN命令,因为我想显示所有学生,包括那些没有购买任何东西的学生。在这篇文章中找到了更多细节。


提前致谢,

4

2 回答 2

4

问题是您从带有连接的事务表中获取多条记录。您可以在事务表上使用子查询,它应该可以解决此问题:

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

奇怪的总数points来自表的连接。Recipient_ID = Student_ID由于您仅在两个表中都有记录时才加入表,因此您将获得笛卡尔数的结果。因此,如果表中有 3 条学生transactions记录,表中有 3 条记录,purchases则结果将显示该学生的 9 条记录,这会改变总数。

请参阅带有演示的 SQL Fiddle

于 2013-01-09T10:16:19.323 回答
0

尝试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`
于 2013-01-09T09:50:01.013 回答