Mysql 为什么我的联接会增加/可能会增加查询中的总和?

Mysql 为什么我的联接会增加/可能会增加查询中的总和?,mysql,sql,join,Mysql,Sql,Join,我想加入三张桌子 第一个表是交易,其中包含学生获得的“分数”的详细信息。此处的相关字段为接收者ID(学生接收点) 第二个表是购买,其中包含学生购买的“奖励”的详细信息。这里的相关字段是学生ID和奖励ID 最后一个表是奖励,详细说明了购买的奖励。此处的相关字段为奖励ID,用户成本(学生为每个奖励支付的价格,用于订购群组会议功能)和标题 我使用的查询如下所示: SELECT t.Recipient_ID AS `ID` , SUM( t.Points ) AS `Points Ear

我想加入三张桌子

第一个表是
交易
,其中包含学生获得的“分数”的详细信息。此处的相关字段为
接收者ID
(学生接收点)

第二个表是购买,其中包含学生购买的“奖励”的详细信息。这里的相关字段是
学生ID
奖励ID

最后一个表是
奖励
,详细说明了购买的奖励。此处的相关字段为
奖励ID
用户成本
(学生为每个奖励支付的价格,用于订购
群组会议
功能)和
标题


我使用的查询如下所示:

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`

由于某种原因,所获得的
积分
输出值大错特错如果我在
购买
上删除
左连接
,则所获得的
积分
输出是正确的

是什么原因让我的
SUM
命令发疯


编辑:请注意,我需要
LEFT 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`

尝试使用
内部联接

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`

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

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`

点的奇怪总数来自表的联接。由于您只在
Recipient\u ID=Student\u ID
上加入表,如果两个表中都有记录,您将获得笛卡尔数目的结果。因此,如果在
交易
表中有一名学生的3条记录,在
购买
表中有3条记录,那么结果将显示该学生的9条记录,这改变了总数


请参见

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

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`

点的奇怪总数来自表的联接。由于您只在
Recipient\u ID=Student\u ID
上加入表,如果两个表中都有记录,您将获得笛卡尔数目的结果。因此,如果在
交易
表中有一名学生的3条记录,在
购买
表中有3条记录,那么结果将显示该学生的9条记录,这改变了总数


请参见《你好,好心情》。谢谢你的努力。
内部联接
没有区别。我还将更新我的原始帖子,添加一个指向我之前问题之一的链接,因为我需要
左连接
来包括没有购买过任何东西的学生。然后奖励将是内部连接,更新了我的回答谢谢-但输出保持不变,获得的
分数
输出恐怕仍然不正确。你好,goodmood。谢谢你的努力。
内部联接
没有区别。我还将更新我的原始帖子,添加一个指向我之前问题之一的链接,因为我需要
左连接
来包括没有购买过任何东西的学生。然后奖励将是内部连接,更新了我的回答谢谢-但输出保持不变,赚取的
积分
输出恐怕仍然不正确。