1

我想通过改变场景来使这个请求复杂化。这是原始请求的链接。 这是原始请求的链接。

我有以下称为技能的 MySQL 表。

ID idUser 技能
1 4 1
2 8 4
3 8 9
4 13 9
5 18 2
6 22 1
7 27 2
8 32 4
9 11 2
10 32 9
10 32 7

例如,我需要选择同时拥有 idSkill 4 和 9 的所有 idUser(强制性技能)。

但我希望有可能通过可选的 idSkills(如果有的话)进行搜索。

必修技能为 9 和 4

可选技能为7

结果将是 idUser 32。

我想到了这个查询:

SELECT id, idUser, idSkill FROM skills WHERE idSkill IN (9,4,7) GROUP BY idUser HAVING (idSkill IN (9,4))

但它显然不起作用。

非常感谢

4

2 回答 2

1

您可以使用聚合和RANK()窗口函数来做到这一点。

这个查询:

SELECT idUser
FROM skills 
WHERE idSkill IN (9, 4, 7) 
GROUP BY idUser 
HAVING SUM(idSkill IN (9, 4)) = 2 -- for the 2 mandatory skills

返回至少具有 2 个必备技能 9 和 4 的所有用户。

如果您使用这样的ORDER BY子句LIMIT

SELECT idUser
FROM skills 
WHERE idSkill IN (9, 4, 7) 
GROUP BY idUser 
HAVING SUM(idSkill IN (9, 4)) = 2 -- for the 2 mandatory skills
ORDER BY COUNT(*) DESC
LIMIT 1

您将从所有具有至少 2 个强制性技能 9 和 4 的用户中获得,只有 1 个用户:技能数量最多的用户(强制性和可选)。

如果要返回关系,请使用RANK()窗口函数:

SELECT idUser
FROM (
  SELECT idUser, RANK() OVER (ORDER BY COUNT(*) DESC) rnk
  FROM skills 
  WHERE idSkill IN (9, 4, 7) 
  GROUP BY idUser 
  HAVING SUM(idSkill IN (9, 4)) = 2 -- for the 2 mandatory skills
) t
WHERE rnk = 1

请参阅演示

于 2021-07-29T14:29:26.033 回答
0

您的答案将是一个简单的查询。

select * from (select distinct b.idUser, (select 1 from skill a where a.idUser=b.idUser and a.idSkill=4) 'four', (select 1 from Skill a where a.idUser=b.idUser and a.idSkill=9) 'nine', (从技能 a 中选择 1,其中 a.idUser=b.idUser 和 a.idSkill=7)从技能 b 中选择 '7')t where t.four=1 and t.nine= 1 和 t.7=1

于 2021-07-29T15:24:02.623 回答