![](/img/trans.png)
[英]SQL query not returning unique results. Which type of join do I need to use?
[英]Which JOIN type do I use to display NULL values in this query?
我正在尝试加入三个桌子。
第一个表是transactions
,其中包含学生获得的“积分”的详细信息。 此处的相关字段是Recipient_ID
(学生接收点)。
第二个表是purchases
,其中包含学生购买的“奖励”的详细信息。 这里的相关字段是Student_ID
和Reward_ID
。
最终表是rewards
,其中详细说明了购买的奖励。 这里的相关字段是Reward_ID
, Cost_to_User
(学生为每种奖励支付的价格;我目前根本没有使用此价格)和Title
。
我想要做的是,提供特定的学生ID列表,以显示学生的积分列表和三个最昂贵的奖励购买。
到目前为止,我编写的SQL语句是:
SELECT
t.Recipient_ID AS `ID` ,
SUM( t.Points ) AS `Points Earned`,
SUBSTRING_INDEX( GROUP_CONCAT(DISTINCT r.Title SEPARATOR ', '),', ',3 ) as `Rewards`
FROM `transactions` t
JOIN `purchases` p ON t.Recipient_ID = p.Student_ID
JOIN `rewards` r ON p.Reward_ID = r.Reward_ID
WHERE T.`Recipient_ID`
IN ( 90128, 90163, 34403, 35501 )
GROUP BY t.`Recipient_ID`
这在一定程度上有效-显示了两名学生,以及他们的总分和最新奖励。
但是,他们的积分总数非常错误,我相信学生们如果没有购买任何物品,就不会显示出来。
如果他们没有购物,我仍然想向他们展示。
我怀疑这是我的JOIN错误,但我也怀疑GROUP_CONCAT
的功能不足以列出三个最昂贵的奖励。 我需要更改我的JOIN,还是需要使用某种子查询?
提前致谢,
我认为您应该看一下使用LEFT JOIN
(请参阅Join的视觉说明 ):
SELECT
t.Recipient_ID AS `ID` ,
SUM( t.Points ) AS `Points Earned`,
SUBSTRING_INDEX( GROUP_CONCAT(DISTINCT r.Title 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, 34403, 35501 )
GROUP BY t.`Recipient_ID`
LEFT JOIN
将返回transactions
表中的所有记录,即使purchases
或rewards
表中没有记录也是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.