0

3 つのテーブルを結合しようとしています。

最初のテーブルにはtransactions、学生が獲得した「ポイント」の詳細が含まれています。ここで関連するフィールドはRecipient_ID(学生がポイントを受け取る) です。

2 番目のテーブルにはpurchases、学生が購入した「特典」の詳細が含まれています。ここで関連するフィールドはStudent_IDReward_IDです。

最終的な表はrewards、購入した報酬の詳細です。ここで関連するフィールドはReward_IDCost_to_User(学生が各報酬に対して支払う価格。現在、これはまったく使用していません) とTitleです。


私がやろうとしているのは、学生 ID の特定のリストを提供して、学生のポイントと 3 つの最も高価な特典の購入のリストを表示することです。

これまでに書いた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`

これはある程度機能します - 2 人の学生が表示され、ポイントの合計と最新の報酬が表示されます。

しかし、ポイントの合計は大きく間違っており、購入していない学生は表示されていないと思います.

学生が購入していない場合でも、学生を表示したいと思います。


間違っているのは私の JOIN だと思いますがGROUP_CONCAT、最も高価な報酬を 3 つ挙げるほど強力ではないと思います。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`

またはテーブルにレコードがない場合でも、 はテーブルからすべてのLEFT JOINレコードを返します。transactionspurchasesrewards

于 2013-01-08T17:56:30.270 に答える