簡體   English   中英

從右表條件獲取左表行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM