MYSQL选择具有特定技能的用户

时间:2009-12-21 14:51:18

标签: mysql join group-concat

到目前为止,我一直在讨论我做过的最复杂的SQL查询,这对大多数人来说可能非常简单(:

我有三个表,User,Skills和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技能的人?

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

为什么不能在LEFT联接中使用INNER JOIN,并为所需技能发出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

答案 2 :(得分:0)

以下是(将为您提供技能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

答案 3 :(得分:0)

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)PRIMARY KEYUNIQUE键的事实(即您不能多次为用户分配技能)。

<强>更新

返回所有技能(以逗号分隔):

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
        )

答案 4 :(得分:0)

你只需要一个

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)