MySQL:按用户ID获取常用记录

时间:2014-06-17 21:45:42

标签: php mysql sql

我不得不认为这是一个相对简单的查询,但我很难过。我有一个成就表,一个用户表和一个users_achievements表。我想根据users_achievements表中的内容确定多个用户共享的成就。

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

即使具有ID 1和2的用户基于achievement_id共享来自users_achievements表的两条公共记录,也不返回任何结果(因此总共4条记录 - 每个achievement_id的每个用户一条记录)。如果我使用“OR”或“IN”我得到记录,但这不包括两个ID,只是...我需要查询来限定两个ID。

2 个答案:

答案 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 :(得分: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获得了共同的和何时获得。