2

我有 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 和 3 技能

我想获得所有具有技能 1 和 2 的用户,所以我想获得 Tom。如何做到这一点?

如果我想获得具有技能 1 或技能 2 的用户 - 这不是问题,但它是 :(

基本上我试图将用户加入 users_skills 表,但我得到了这样的结果:

+-----------------------+
|user_id  |name |sill_id|
+-----------------------+
|1        |Tom  |   1   |
|1        |Tom  |   2   |
+-----------------------+
etc 

所以我有两行,我不知道如何在这里实现 AND 语句。

4

2 回答 2

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
于 2013-10-11T03:57:47.030 回答
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
)

在这里拉小提琴。注意我还添加了额外的用户和技能来测试所有案例。

简而言之:你首先摆脱那些拥有额外不需要的技能的人,然后你摆脱那些缺乏所需技能的人。

输出:

| ID | NAME | SKILL_ID |
|----|------|----------|
|  1 |  Tom |        1 |
|  1 |  Tom |        2 |
于 2013-10-11T04:28:43.503 回答