GROUP_CONCAT и join, как включить не соответствующие строки также - PullRequest
0 голосов
/ 02 ноября 2018

Как включить несовпадающие строки в GROUP_CONCAT? Здесь Таблица cls_sec содержит каждый раздел, присвоенный классу.

Класс Один имеет 2 сечение - ' A ' и ' B ',

Класс Два имеет 1 секцию ' A '

Класс Три имеет Нет раздел.

Здесь раздел является ключевым для соединения между таблицами, но как я могу включить класс три , который не имеет раздела в GROUP_CONCAT результате.

Таблица cls - списки класса

id  |   ttl
===========
1   |   One
2   |   Two
3   |   Three

Таблица sec - списки разделов

id  |   ttl
===========
1   |   A
2   |   B

Таблица cls_sec - списки каждого раздела, отнесенного к классу

id  |   c_id|   s_id    
=====================
1   |   1   |   1
2   |   1   |   2
3   |   2   |   1

Согласно строкам в cls_sec, мои ожидания такие же, как и ниже,

1.One-B,1.One-A,2.Two-A,3.Three 

если у класса есть раздел, каждый раздел будет отображаться со своим связанным классом, else echo only class (если какой-либо раздел не назначен этому классу):

Итак, что я делаю в MySQL, выбираю, если совпадают строки ИЛИ пустые строки

MySQL CODE

SELECT
    GROUP_CONCAT(DISTINCT cls.id,'.',cls.en_ttl, '-', sec.en_ttl 
                 ORDER BY cls.id) AS cls
FROM
    cls
LEFT JOIN
    cls_sec ON cls_sec.c_id = cls.id
JOIN
    sec ON sec.id = cls_sec.s_id OR cls_sec.s_id is NULL 
ORDER BY cls.id DESC

Но я получаю

1.One-B,1.One-A,2.Two-A,3.Three-B,3.Three-A

1 Ответ

0 голосов
/ 02 ноября 2018
  • Join с условием OR .. IS NULL необходимо заменить на LEFT JOIN.
  • Нет необходимости в ORDER BY в конце, когда вы агрегируете в один ряд.
  • Используйте функцию Coalesce(), чтобы рассмотреть случай, когда для класса нет раздела.
  • Я добавил Concat() функцию внутри Group_concat(), для простоты понимания. Тем не менее, как , предложенный @ Raymond Nijland , мы все равно можем работать без него.
  • Concat() функция возвращает null, если любая из подстрок для конкатенации равна null. Таким образом, когда раздела нет, нам нужно переместиться на - в Concat(), чтобы избежать любых следов - в строке.

Попробуйте:

SELECT
    GROUP_CONCAT(CONCAT(cls.id,'.',cls.en_ttl, 
                        COALESCE(CONCAT('-',sec.en_ttl), ''))  
                 ORDER BY cls.id) AS cls
FROM
    cls
LEFT JOIN
    cls_sec ON cls_sec.c_id = cls.id
LEFT JOIN
    sec ON sec.id = cls_sec.s_id
...