0

私は2つのテーブルを持っています:

TblAchievements >> [ID、AchName]

TblUsersAchievements >> [UserID、AchID]

結果は次のようにする必要があります(4つの実績があり、ユーザー1が1と2を達成したと仮定します。

 ID     AchName     UserID     AchID
 1      first         1         1
 2      second        1         2
 3      third        NULL      NULL
 4      fourth       NULL      NULL

私はこのようなことを試しました:

 SELECT 
   tblacheivements.id,
   tblacheivements.achname,
   tbluserachievements.uid,
   tbluserachievements.achid
 FROM
   tbluserachievements
 RIGHT OUTER JOIN tblacheivements ON (tbluserachievements.achid = tblacheivements.id)
 WHERE
   tbluserachievements.uid = 1 OR 
   tbluserachievements.uid IS NULL

正しい結果が得られますが、ユーザーを変更すると結果が間違っています。

4

1 に答える 1

2

特定のユーザーが持っている、または持っていないすべての実績を一覧表示したいようです。をフィルタリングしUserID、結果セットに各アチーブメント行を保持するには、UserID選択を外部結合条件に含める必要があります(句に入れると、/の後に評価されるWHEREため、ユーザーがアチーブメントを達成した行のみが選択されます。。)WHEREFROMJOIN

このソリューションを試してください:

SELECT    *
FROM      tblachievements a
LEFT JOIN tbluserachievements b ON a.id = b.achid AND b.uid = 1

追加:

アプリケーションの要件によっては、ユーザーがそれを達成したかどうかを示すブール値を単純に持つ方がよい場合があります(達成した場合は達成した1場合0)。

SELECT    a.*, b.achid IS NOT NULL AS achieved
FROM      tblachievements a
LEFT JOIN tbluserachievements b ON a.id = b.achid AND b.uid = 1

どちらが生成されますか:

 id     achname     achieved
 ---------------------------
 1      first       1     
 2      second      1     
 3      third       0   
 4      fourth      0   
于 2012-07-31T18:54:22.603 に答える