0

我有两张桌子:

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子句中只会选择用户获得成就的行,因为在/WHERE之后进行评估.)FROMJOIN

试试这个解决方案:

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 回答