0

我正在尝试加入三个表。

第一个表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,还是需要使用某种子查询?

提前致谢,

4

1 回答 1

4

我认为您应该考虑使用LEFT 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`

即使or表中没有记录, ALEFT JOIN也会返回表中的所有记录。transactionspurchasesrewards

于 2013-01-08T17:56:30.270 回答