2

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

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

トランザクションテーブル

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

購入テーブル

ファイナルテーブルはrewards、購入した報酬の詳細です。ここでの関連フィールドはReward_ID、 (関数Cost_to_Userの注文に使用されている各報酬に対して学生が支払う価格)とです。GROUP_CONCATTitle

報酬テーブル


私が使用しているクエリは次のとおりです。

SELECT
  t.Recipient_ID AS `ID` ,
  SUM( t.Points ) AS `Points Earned`,
  SUBSTRING_INDEX( GROUP_CONCAT(DISTINCT r.Title ORDER BY r.Cost_to_User DESC 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, 33888, 34240, 137674 )
GROUP BY  t.`Recipient_ID`

何らかの理由で、Points Earned出力が大幅に間違っています。onを削除すると、出力は正しくLEFT JOINpurchasesPoints Earnedなります。

SUM私のコマンドを狂わせているのは、その参加について何ですか?


編集LEFT JOIN:購入していない学生を含むすべての学生を表示したいので、コマンドが必要であることに注意してください。詳細については、この投稿をご覧ください。


前もって感謝します、

4

2 に答える 2

4

問題は、結合を使用してトランザクションテーブルから複数のレコードを取得していることです。トランザクションテーブルでサブクエリを使用すると、この問題が修正されるはずです。

SELECT t.`ID` ,
  t.`Points Earned`,
  SUBSTRING_INDEX( GROUP_CONCAT(DISTINCT r.Title ORDER BY r.Cost_to_User DESC SEPARATOR ', '),', ',3 ) AS `Rewards`
FROM
(
  select t.Recipient_ID AS `ID`, sum(t.Points) AS `Points Earned`
  from `transactions` t
  group by t.Recipient_ID
) t
LEFT JOIN `purchases` p 
   ON t.`ID` = p.Student_ID
LEFT JOIN `rewards` r 
  ON p.Reward_ID = r.Reward_ID
WHERE t.`ID` 
  IN ( 90128, 90163, 33888, 34240, 137674 )
GROUP BY  t.`ID`

SQL FiddlewithDemoを参照してください

の奇妙な合計はpoints、テーブルの結合から来ています。Recipient_ID = Student_ID両方のテーブルにレコードがある場合にのみテーブルを結合しているため、デカルト数の結果が得られます。したがって、テーブルに学生のtransactions3つのレコードがあり、テーブルに3つのレコードがあるpurchases場合、結果にはその学生の9つのレコードが表示され、合計が変更されます。

SQL FiddlewithDemoを参照してください

于 2013-01-09T10:16:19.323 に答える
0

で試してみてくださいINNER JOIN

SELECT
    t.Recipient_ID AS `ID` ,
    SUM( t.Points ) AS `Points Earned`,
    SUBSTRING_INDEX( GROUP_CONCAT(DISTINCT r.Title ORDER BY r.Cost_to_User DESC SEPARATOR ', '),', ',3 ) AS `Rewards`
FROM  `transactions` t
LEFT JOIN `purchases` p 
ON t.Recipient_ID = p.Student_ID
INNER JOIN `rewards` r 
ON p.Reward_ID = r.Reward_ID
WHERE t.`Recipient_ID` 
IN ( 90128, 90163, 33888, 34240, 137674 )
GROUP BY  t.`Recipient_ID`
于 2013-01-09T09:50:01.013 に答える