MySQL同时选择多个id,可选id with php

我想通过更改场景来使此请求复杂化。 这是原始请求的链接。 Here is the link to the original request.

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

id idUser idSkill
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 的 idUsers(强制技能)。

但我希望有可能通过可选的 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))

但它显然不起作用。

非常感谢

wolaiwen_0 回答:MySQL同时选择多个id,可选id with php

您可以使用聚合和 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

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

如果您像这样使用带有 ORDER BYLIMIT 子句:

SELECT idUser
FROM skills 
WHERE 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,7) 
  GROUP BY idUser 
  HAVING SUM(idSkill IN (9,4)) = 2 -- for the 2 mandatory skills
) t
WHERE rnk = 1

参见demo

,

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

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',(select 1 from Skill a where a.idUser=b.idUser and a.idSkill=7) 'seven' from Skill b) t where t.four=1 and t .nine=1 和 t.seven=1

本文链接:https://www.f2er.com/15543.html

大家都在问