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 的用户。
如果您使用带有 LIMIT
的 ORDER 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
我想通过改变场景来使这个请求复杂化。
这是原始请求的 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 的用户。
如果您使用带有 LIMIT
的 ORDER 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