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