MySQL 특정 기술을 가진 사용자를 선택합니다
-
20-09-2019 - |
문제
나는 지금까지 내가 한 가장 복잡한 SQL 쿼리를 통해 내 길을 갈망하고 있습니다. 아마도 대부분의 사람들에게 매우 간단 할 것입니다 (:
나는 3 개의 테이블, 사용자, 기술 및 user_skills가 있습니다. 그 분야는 상당히 자기 설명이어야합니다.
나는 내 기준을 충족하는 하나 이상의 기술을 가진 사람들을 선택하고 싶습니다.
내가 후에 기술을 가진 사용자를 선택할 수 있지만 여러 기술을 쿼리하기위한 구문에 대해서는 잘 모르겠습니다.
하나의 쿼리 만 사용하고 싶으므로 Group_Concat을 사용하려고합니다.
여기 내 SQL이 있습니다.
SELECT User_id, first_name, last_name, county, GROUP_CONCAT(CAST(Skill_id AS CHAR))
FROM User LEFT JOIN User_Skills ON User.id = User_Skills.User_id
LEFT JOIN Skills ON User_Skills.Skill_id = Skills.id GROUP BY User_id
User_id first_name last_name county GROUP_CONCAT(CAST(Skill_id AS CHAR))
1000 Joe Blow West Yorkshire 8,6,1,9,7,3,5,10
1001 Fred Bloggs COUNTY1 5,8,2,7,9
1003 asdf asdf1 Some County 10,8,2
기술 5와 9를 가진 사람들 만 검색을 어떻게 제한합니까?
해결책
SELECT *
FROM users u
WHERE EXISTS
(
SELECT NULL
FROM user_skills us
WHERE us.skill_id IN (5, 9)
AND us.user_id = u.id
LIMIT 1, 1
)
이것은 사실에 의존합니다 (user_id, skill_id)
a PRIMARY KEY
또는 a UNIQUE
키 (즉, 사용자에게 두 번 이상 기술을 할당 할 수는 없습니다).
업데이트:
모든 기술을 반환하려면 (쉼표 분리) :
SELECT u.*,
(
SELECT GROUP_CONCAT(skill_id)
FROM user_skills uso
WHERE uso.user_ud = u.user_id
) AS all_skills
FROM users u
WHERE EXISTS
(
SELECT NULL
FROM user_skills us
WHERE us.skill_id IN (5, 9)
AND us.user_id = u.id
LIMIT 1, 1
)
다른 팁
SELECT User_id, first_name, last_name, county, GROUP_CONCAT(CAST(Skill_id AS CHAR))
FROM User JOIN User_Skills ON User.id = User_Skills.User_id
JOIN Skills ON User_Skills.Skill_id IN (5,9)
GROUP BY User_id
여러 기술 기록을 방지하려면 하위 퀘스트가 필요할 수 있습니다.
SELECT User_id, first_name, last_name, county,
(
SELECT (GROUP_CONCAT(CAST(subSkill.Skill_id AS CHAR))
FROM Skills as subSkill WHERE subSkill.skill_id = User_Skills.skill_id
GROUP BY subSkill.skill_id
)
FROM User JOIN User_Skills ON User.id = User_Skills.User_id
JOIN Skills ON User_Skills.Skill_id IN (5,9)
GROUP BY User_id
왜 왼쪽 조인의 내부 조인을 사용하고 필요한 기술에 대한 WHERE 조항을 발행 할 수없는 이유는 무엇입니까?
SELECT User_id, first_name, last_name, county, GROUP_CONCAT(CAST(Skill_id AS CHAR))
FROM User
INNER JOIN User_Skills ON User.id = User_Skills.User_id
INNER JOIN Skills ON User_Skills.Skill_id = Skills.id GROUP BY User_id
WHERE skill_id = 5 OR skill_id=9
다음은 다음과 같습니다 (사용자에게 기술 5와 9를 제공 할 수 있습니다) :
SELECT User_id, first_name, last_name, county FROM User INNER JOIN User_Skills ON User.id = User_Skills.User_id INNER JOIN Skills ON User_Skills.Skill_id = Skills.id WHERE Skills.Skill_id = 5 AND Skills.Skill_id = 9 GROUP BY User_id
당신은 그냥 필요합니다
HAVING FIND_IN_SET('5', skills) AND FIND_IN_SET('9', skills)
그룹 후 (여기서 "기술"은 그룹화 된 열의 이름입니다). 이제 쿼리가 보일 것입니다
SELECT User_id, first_name, last_name, county, GROUP_CONCAT(CAST(Skill_id AS CHAR)) as skills
FROM User LEFT JOIN User_Skills ON User.id = User_Skills.User_id
LEFT JOIN Skills ON User_Skills.Skill_id = Skills.id GROUP BY User_id
HAVING FIND_IN_SET('5', skills) AND FIND_IN_SET('9', skills)
제휴하지 않습니다 StackOverflow