我正在尝试加入三张桌子。
第一个表格是 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,还是需要使用某种子查询?
提前致谢,
答案 0 :(得分:4)
我认为您应该考虑使用LEFT JOIN
(请参阅Visual Explanation of Joins):
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
表中的所有记录。