получить строки левой таблицы из правильных условий таблицы - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть три таблицы, подобные этой:

персона:

  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
...

IМне нужно получить все навыки людей, когда я просто отправлю один из их навыков в своем запросе.

Это мой код:

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".

Заранее спасибо.

1 Ответ

0 голосов
/ 07 декабря 2018

Вам нужно будет сослаться на несколько таблиц дважды.

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 

Sidenote: Я оставил это в покое, но ваши критерии группировки могут быть проблематичными при определенных конфигурациях.

... и альтернатива, если вы откажетесь от дополнительных ссылок на таблицы, но вряд ли будет быстрее, это:

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;
...