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   |
+-----------------+

その結果、2人のユーザーがいます。

  • トムは 1 と 2 のスキルを持っています
  • Adam は 1 と 2 と 3 のスキルを持っています

スキル 1 と 2 を正確に持っているすべてのユーザーを取得したいので、Tom を取得します。それを達成する方法は?

スキル 1 またはスキル 2 を持つユーザーを獲得したい場合 - それは問題ではありませんが、それは :(

基本的に、ユーザーを users_skills テーブルに参加させようとしましたが、次のような結果が得られました。

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

したがって、2 つの行があり、ここで AND ステートメントを実現する方法がわかりません。

4

2 に答える 2

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 に答える
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 に答える