MySQL дублирует содержимое GROUP_CONCAT в одной из строк - PullRequest
0 голосов
/ 16 марта 2019

У меня есть 3 таблицы:

  • store_cat: категории
  • store_cat_attribute: атрибуты для каждой категории
  • store_item: элементы, которые необязательно связаны с категорией

Мне нужен запрос, который возвращает строки, содержащие следующие столбцы:

  • Категория: Атрибут1, Атрибут2, Атрибут3
  • Элемент COUNT

Это мой текущий запрос, который работает почти нормально:

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(DISTINCT store_item.id_item) AS products
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

Проблема в том, что в одной из строк, как ни странно, столбец name дублирует атрибуты в GROUP_CONCAT:

Категория : Атрибут1, Атрибут1, Атрибут2, Атрибут2, Атрибут3, Атрибут3

Есть идеи о том, почему это происходит и как его решить?Спасибо!

Здесь вы можете проверить sqlfiddle: http://sqlfiddle.com/#!9/7da2d3/5

1 Ответ

1 голос
/ 16 марта 2019

Вы вычисляете две разные вещи в одном запросе (GROUP_CONCAT и COUNT).От JOIN до store_item приведет к дублированию.Вы можете перейти к одному из столбцов выбора:

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, 
   (select count(distinct store_item.id_item) from store_item where store_item.id_cat = store_cat.id_cat) AS products 
FROM store_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

http://sqlfiddle.com/#!9/7da2d3/36

...