来自多行的Mysql“where”和“and”语句

时间:2013-10-11 03:29:03

标签: php mysql sql

我有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技能
  • Adam hass 1 and 2 and 3 skill

我希望让所有具有完全技能1和2的用户,所以我想得到汤姆。如何实现?

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

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

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

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

2 个答案:

答案 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 |