MySQL select 同时有多个 ID,可选 ID 为 php

MySQL select multiple id at the same time with optional id with php

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

我有以下MySQLtable技能

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

我需要select,例如,同时拥有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))

但是显然不行。

非常感谢

您可以使用聚合和 RANK() window 函数来完成。

本次查询:

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

returns 所有至少拥有 2 个强制技能 9 和 4 的用户。

如果您使用带有 LIMITORDER BY 子句,如下所示:

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() window 函数:

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

参见demo

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

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