MYSQL で特定のスキルを持つユーザーを選択する
-
20-09-2019 - |
質問
私はこれまでに行った中で最も複雑な 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 を持つ人のみに検索を制限するにはどうすればよいですか?
解決
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 KEY
または 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
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
ここですか(あなたのスキル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