2014-06-17 35 views
1

我不得不認爲這是一個相對容易的查詢,但我很難過。我有成就表,用戶表和users_achievements表。我想根據users_achievements表中存在的內容確定多個用戶共享的共同成就。MySQL:通過用戶ID獲取常用記錄

SELECT a.id, a.name, a.description, a.badge_path, b.earned_on 
FROM achievements AS a 
LEFT JOIN users_achievements AS b ON a.id=b.achievements_id 
WHERE b.users_id=1 
    AND b.users_id=2 

這不返回任何結果,即使與基於所述achievements_id從users_achievements表ID 1和2共享兩個公共記錄的用戶(SO 4條共 - 一個用於每個用戶的每個achievement_id)。如果我使用「OR」或「IN」,我會得到記錄,但是這不包括BOTH ID,​​只是...我需要查詢來限定這兩個ID。

+1

'WHERE b.users_id = 1 AND b.users_id = 2' - 這絕不可能是真的。 – user2864740

+0

是的,我意識到...是爲了顯示我正在嘗試做什麼...應該已經注意到了。謝謝。 –

回答

2

這裏有一種方法:

SELECT a.id, a.name, a.description, a.badge_path, ua.earned_on 
FROM achievements a JOIN 
    users_achievements ua 
    ON a.id = ua.achievements_id 
WHERE ua.users_id IN (1, 2) 
GROUP BY a.id, a.name, a.description, a.badge_path, ua.earned_on 
HAVING count(distinct ua.users_id) = 2; 

注意以下幾點:

  • 該表的別名一個縮寫。這使得查詢更易於閱讀。
  • left join應該是不必要的。用這樣的表結構,外鍵關係應該匹配。
  • WHERE子句僅針對兩個用戶進行過濾。
  • HAVING子句保證結果中都出現兩者。
1

試試這個

SELECT a.id, a.name, a.description, a.badge_path, b.earned_on, c.earned_on 
FROM achievements AS a 
    JOIN users_achievements AS b ON a.id = b.achievements_id 
    JOIN users_achievements AS c ON a.id = c.achievements_id 
WHERE b.users_id=1 AND c.users_id=2 

這裏你選擇什麼樣的成績用戶1 & 2共同點,當已經獲得。

+0

選擇戈登的答案,但這似乎也很好。 Upvoted。謝謝。 –

相關問題