我想加入三张桌子。
第一个表格是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 JOIN上的purchases,则Points Earned输出正确。
是什么让我的SUM命令变得疯狂?
编辑:请注意,我需要LEFT JOIN命令,因为我想显示所有学生,包括那些没有购买任何东西的学生。更多详情见post
提前谢谢你,

最佳答案

问题是,使用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

关于mysql - 为什么我的JOIN增加/可能使查询中的SUM相乘?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14232199/

10-16 13:24