我使用哪种JOIN类型在此查询中显示NULL值?

时间:2013-01-08 17:54:31

标签: mysql

我正在尝试加入三张桌子。

第一个表格是 transactions ,其中包含学生获得的“积分”的详细信息。这里的相关字段是Recipient_ID(学生接收积分)。

第二个表格是 purchases ,其中包含学生购买的“奖励”详情。此处的相关字段为Student_IDReward_ID

决赛桌 rewards 详细说明了所购买的奖励。这里的相关字段为Reward_IDCost_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,还是需要使用某种子查询?

提前致谢,

1 个答案:

答案 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 JOINtransactions表中没有记录,purchases也会返回rewards表中的所有记录。