2012-07-31 62 views
0

我有兩個表:如何從表中選擇所有,並從另一個表中選擇匹配項?

TblAchievements >> [ID,AchName]

TblUsersAchievements >> [用戶ID,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 

它得到正確的結果,但當我改變用戶結果是錯誤的。

+1

請在這個問題上花更多時間 - 這是非常混亂。我認爲這個字符串中可能有太多逗號。 'ID,AchName,UserID,AchID 1,首先,1,1 2,第二,1,2 3,第三,NULL,NULL 4,第四,NULL,NULL' – 2012-07-31 18:48:08

+0

現在更清楚了嗎? – 2012-07-31 18:53:05

+0

你的where子句沒有意義,它基本上會得到所有的行。 – JonH 2012-07-31 18:54:26

回答

2

您似乎想列出特定用戶擁有或不擁有的所有成就。要過濾UserID,但仍保留結果集中的每個成就行,必須在外連接條件中包含UserID選項(將其放入WHERE子句中將僅選擇用戶實現此成就的行,因爲WHEREFROM/JOIN評估)

嘗試這種解決方案:

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 
+0

這只是Brilient – 2012-07-31 19:17:35

相關問題