[英]MySQL select multiple id at the same time with optional id with php
我想通過改變場景來使這個請求復雜化。 這是原始請求的鏈接。 這是原始請求的鏈接。
我有以下 MySQL 表稱為技能。
ID | 用戶名 | 技能 |
---|---|---|
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))
但它顯然不起作用。
非常感謝
您可以使用聚合和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 的所有用戶。
如果像這樣使用帶有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()
,請使用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
請參閱演示。
您的回答將是一個簡單的查詢。
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) t 中的 'seven',其中 t.four=1 和 t.nine= 1 和 t.seven=1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.