Объединить непустую CONCAT_GROUP с родительским столбцом в MySQL - PullRequest
0 голосов
/ 22 февраля 2019

Мне нужно получить список категорий из store_cat, с дочерним элементом COUNT из store_item (количество товаров) и GROUP_CONCAT из store_cat_attributes (список атрибутов).Дело в том, что с помощью функции CONCAT мне нужно прикрепить значение GROUP_CONCAT к столбцу name в родительской таблице (store_cat), и вот тут все становится хитро.

Это прекрасно работает:

SELECT
    store_cat.id_cat AS id,
    store_cat.name AS name,
    GROUP_CONCAT(store_cat_attribute.name SEPARATOR ", ") AS attributes,
    COUNT(store_item.id_item) AS products,
    store_cat.flg_public AS flg_public
FROM store_cat
LEFT JOIN store_item ON store_item.id_cat = store_cat.id_cat
LEFT JOIN store_cat_attribute ON store_cat_attribute.id_cat = store_cat.id_cat
WHERE store_cat.id_store = 1
GROUP BY store_cat.id_cat
ORDER BY name

Но это то, что мне действительно нужно.Проблема в том, что когда я выполняю этот запрос, значение store_cat.name показывает пустое значение при отсутствии атрибутов:

SELECT
    store_cat.id_cat AS id,
    CONCAT(store_cat.name, " (", GROUP_CONCAT(store_cat_attribute.name SEPARATOR ", "), ")") AS name,
    COUNT(store_item.id_item) AS products,
    store_cat.flg_public AS flg_public
FROM store_cat
LEFT JOIN store_item ON store_item.id_cat = store_cat.id_cat
LEFT JOIN store_cat_attribute ON store_cat_attribute.id_cat = store_cat.id_cat
WHERE store_cat.id_store = 1
GROUP BY store_cat.id_cat ORDER BY name

По сути, идея заключается в том, что store_cat.name столбец должен содержать список атрибутов с CONCAT и GROUP_CONCAT, вот так:

  • Comidas
  • Correas (S, M, L, XL)
  • Juguetes
  • Medicinas

Вот текущее SQLfiddle .Кстати, что-то не так с порядком атрибутов в текущем GROUP_CONCAT.Отображается ( XL , S, M, L) вместо (S, M, L, XL ).

Решаемые проблемы:

  1. Используйте GROUP_CONCAT для объединения атрибутов с именем категории только при наличии атрибутов.

  2. Используйте store_cat_attributes.position для установки порядка для GROUP_CONCAT значений.

Есть идеи?Спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Следующее выражение должно возвращать ожидаемые результаты:

CONCAT(
    store_cat.name,
    IFNULL(
        CONCAT(
            ' (', 
            GROUP_CONCAT(
                store_cat_attribute.name 
                ORDER BY store_cat_attribute.position 
                SEPARATOR ', '
             ),
            ')'
        ),
        ''
    )
) AS name

По сути, это просто пытается GROUP_CONCAT() атрибуты, а если результат NULL, то он превращает список атрибутов впустая строка.Обратите внимание, что GROUP_CONCAT поддержка ORDER BY.

Я также исправил предложение GROUP BY: в не древних версиях MySQL все неагрегированные столбцы должны появляться в предложении where (вы пропускаете store_cat.name).

Демонстрация на DB Fiddle с вашими примерами данных:

SELECT 
    store_cat.id_cat AS id,
    CONCAT(
        store_cat.name,
        IFNULL(
            CONCAT(
                ' (', 
                GROUP_CONCAT(store_cat_attribute.name ORDER BY store_cat_attribute.position SEPARATOR ', '),
                ')'
            ),
            ''
        )
    ) AS name, 

    COUNT(store_item.id_item) AS products, 
    store_cat.flg_public AS flg_public 
FROM 
    store_cat 
    LEFT JOIN store_item ON store_item.id_cat = store_cat.id_cat 
    LEFT JOIN store_cat_attribute ON store_cat_attribute.id_cat = store_cat.id_cat 
WHERE store_cat.id_store = 1 
GROUP BY store_cat.id_cat, store_cat.name
ORDER BY name;
| id  | flg_public | name                  | products |
| --- | ---------- | --------------------- | -------- |
| 3   | 1          | Comidas               | 0        |
| 2   | 1          | Correas (S, M, L, XL) | 4        |
| 1   | 1          | Juguetes              | 2        |
| 4   |            | Medicinas             | 0        |
...