0

私は、これまでに行った中で最も複雑な SQL クエリを混乱させています。これは、おそらくほとんどの人にとって非常に単純です (:

User、Skills、User_Skills の 3 つのテーブルがあります。そのフィールドは、かなり自明である必要があります。

自分の基準を満たすスキルを 1 つ以上持っている人を選びたい。

求めているスキルを持つユーザーを選択できますが、複数のスキルを照会するための構文がわかりません。

クエリを 1 つだけ使用したいので、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 を持つ人のみに検索を制限するにはどうすればよいですか?

4

5 に答える 5

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
于 2009-12-21T14:56:23.303 に答える
0

LEFT結合の代わりにINNERJOINを使用して、必要なスキルに対して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
于 2009-12-21T14:56:10.560 に答える
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
于 2009-12-21T14:57:24.380 に答える
0

あなただけが必要です

HAVING FIND_IN_SET('5', skills) AND FIND_IN_SET('9', skills)

group by の後 (「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)
于 2009-12-23T17:00:28.387 に答える
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
        )
于 2009-12-22T15:58:25.683 に答える