php - Mysql "where"和 "and"语句来自多行

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

所以结果我有两个用户:

  • Tom 有 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 

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

最佳答案

这是解决方案。棘手的部分是,不仅要匹配这些技能,而且不能匹配其中的任何技能。

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
)

fiddle here .注意我还添加了额外的用户和技能来测试所有案例。

简而言之:您首先要摆脱那些拥有额外不需要的技能的人,然后再摆脱那些技能不足的人。

输出:

| ID | NAME | SKILL_ID |
|----|------|----------|
|  1 |  Tom |        1 |
|  1 |  Tom |        2 |

关于php - Mysql "where"和 "and"语句来自多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19309806/

相关文章:

php - 在 jquery 中使用数组构建过滤器

php - 如何从 Mysql 中的值以外的列中选择所有值?

sql - 将数据库架构复制到现有数据库

php - 如何在谷歌云存储中存储同名文件

php - 使用 rowspan PHP 创建动态表

php - sql复选框和多选过滤

mysql - 从组中选择最旧的两条记录

mysql - 操作数应包含 1 列错误

mysql - 在 SQL 中选择行数据和缩放器

python - 使用 SQLAlchemy 动态获取列名