문제

나는 지금까지 내가 한 가장 복잡한 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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top