我有3张桌子:
users
+---------+
|id | name|
+---------+
|1 | Tom |
|2 | Adam|
+---------+
skills
+------------+
|id |name |
+------------+
|1 |baking |
|2 |driving|
|3 |etc |
+------------+
users_skills
+-----------------+
|user_id |skill_id|
+-----------------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
+-----------------+
所以结果我有两个用户:
我希望让所有具有完全技能1和2的用户,所以我想得到汤姆。如何实现?
如果我想获得技能1或技能2的用户 - 这不是问题,但它是:(
基本上我尝试使用users_skills表加入用户,但我得到这样的结果:
+-----------------------+
|user_id |name |sill_id|
+-----------------------+
|1 |Tom | 1 |
|1 |Tom | 2 |
+-----------------------+
etc
所以我有两行,我不知道如何在这里实现AND语句。
答案 0 :(得分:0)
您需要DISTINCT函数(和GROUP BY):
SELECT DISTINCT(u.name)
FROM users AS u
JOIN users_skills AS us
ON u.id = us.user_id
WHERE us.skillID IN (1,2)
GROUP BY u.id
答案 1 :(得分:0)
这是解决方案。棘手的部分是这样一个事实:不仅要匹配这些技能,还要与其中任何技能不匹配。
SELECT u.id, u.name, us.skill_id FROM users u
JOIN users_skills us ON u.id = us.user_id
WHERE u.id IN (
SELECT user_id FROM users_skills
WHERE user_id NOT IN (
SELECT user_id FROM users_skills
WHERE skill_id NOT IN (1, 2)
)
GROUP BY user_id
HAVING COUNT(DISTINCT skill_id) = 2
)
小提琴here。注意我还添加了额外的用户和技能来测试所有情况。
简而言之:你首先要摆脱那些拥有额外不需要的技能的人,然后你就摆脱那些技能不足的人。
<强>输出:强>
| ID | NAME | SKILL_ID |
|----|------|----------|
| 1 | Tom | 1 |
| 1 | Tom | 2 |