[英]get left table rows from right table conditions
我有三個這樣的表:
人:
id | name | gender --------------------------- 1 Joe male 2 Daniel male 3 Sarah female
person_skills:
person_id | skill_id --------------------------- 1 1 1 2 1 3 2 1 2 2 ...
技巧:
id | skill_name ----------------------- 1 Writing 2 Programming 3 Singing ...
當我在查詢中僅發送某人的技能時,我需要獲得他們的所有技能。
這是我的代碼:
SELECT a.name, a.gender,
GROUP_CONCAT(DISTINCT c.skill_name),
GROUP_CONCAT(DISTINCT c.id as skill_id)
FROM persons a
LEFT JOIN person_skills b ON b.person_id = a.id
LEFT JOIN skills c ON c.id = b.skill_id
WHERE b.skill_id = 3 GROUP BY a.id
我想要結果:
name | gender | skill_name | skill_id ---------------------------------------------- Joe male Writing 1 Programming 2 Singing 3
但是此代碼僅返回skill_id“ 3”和skill_name“ Singing”。
提前致謝。
您需要兩次引用一些表。
SELECT p.name, p.gender,
GROUP_CONCAT(DISTINCT s.skill_name),
GROUP_CONCAT(DISTINCT s.id as skill_id)
FROM person_skills AS ps0
INNER JOIN persons AS p ON ps0.person_id = p.id
LEFT JOIN person_skills ps ON p.id = ps.person_id
LEFT JOIN skills s ON s.id = ps.skill_id
WHERE ps0.skill_id = 3
GROUP BY p.id
旁注:我沒有理會,但是在某些配置下您的分組條件可能會出現問題。
...以及另一種選擇,如果您不喜歡多余的表引用,但是不太可能更快:
SELECT p.name, p.gender,
GROUP_CONCAT(DISTINCT s.skill_name),
GROUP_CONCAT(DISTINCT s.id as skill_id)
FROM persons AS p
LEFT JOIN person_skills ps ON p.id = ps.person_id
LEFT JOIN skills s ON s.id = ps.skill_id
GROUP BY p.id
HAVING COUNT(CASE s.skill_id WHEN 3 THEN 1 ELSE NULL) > 0;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.