我不得不认为这是一个相对简单的查询,但我很难过。我有一个成就表,一个用户表和一个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。
答案 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获得了共同的和何时获得。