【问题标题】:MYSQL selecting users with specific skillsMYSQL 选择具有特定技能的用户
【发布时间】:2010-12-28 18:31:56
【问题描述】:

到目前为止,我一直在摸索我做过的最复杂的 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 的人?

【问题讨论】:

  • 修复了您提到的列问题 - 请参阅更新。

标签: mysql join group-concat


【解决方案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

【讨论】:

  • 以前从未使用过 IN 方法.. 谢谢你,但它显示为结果 User_id first_name last_name 县 GROUP_CONCAT(CAST(Skill_id AS CHAR)) 1000 Joe Blow West Yorkshire 5,5,5, 5,5,5,5,5,5,5,5,5,5,5,6,7,8,9,9,9,9,9,9,9,9,...
  • 那里,我更新了我的答案,看看这是不是你需要的,我们会从那里开始。
  • 再次感谢!它无法正常工作,因为 GROUP_CONCAT(CAST(Skill_id AS CHAR)) 不在字段列表中。也许是因为我们在加入之前选择了它?我不确定。
  • 你有需要它的理由吗?
【解决方案2】:
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
        )

【讨论】:

  • 谢谢!如何扩展它以显示技能 ID?
  • 我想我可能问错了问题。我想返回所有具有特定技能的用户,包括他们拥有的所有技能。
【解决方案3】:

为什么不能只使用 INNER JOIN 代替 LEFT 连接,并为所需技能发出 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

【讨论】:

  • 谢谢,但这行不通,因为我需要用户同时具备两种技能,而不是其中一种。
【解决方案4】:

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

【讨论】:

  • 一个技能不能同时是技能 ID 5 和 9!
【解决方案5】:

你只需要一个

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多