MySQL выбирает несколько реляционных таблиц в одну строку с group_concat - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть 5 таблиц: productCategory, products, productOptions, options, optionsGroup.То, что я пытаюсь сделать, это как-то конкатить и сгруппировать их в один запрос, чтобы получить одну строку со всей информацией об одном продукте.Например, определенный тип пищи будет иметь разные размеры и разные вкусы;Бутылки имеют разные размеры и запахи.Вот таблицы:

productCategory

categoryId    categoryName
1             food
2             freshener

product

productId    productCategoryRef    productName
1            1                     ....
2            1
3            2
4            2
FK references categoryId

productOptions

categoryRef  optionsRef
1            1
1            3
2            2
2            4
FK categoryRef references productCategory (categoryId)
FK optionsRef references options (optionsId)

options

optionsId    optionsName
1            kg
2            ml
3            Flavor
4            Fragrance

optionsGroup

groupId    groupOptionRef  groupName
1          1               3
2          1               7
3          1               14
4          2               50
5          2               250
6          3               Chicken
7          3               Beef
8          4               Alpine
9          4               Berries
FK groupOptionRef references options (optionId)

Таким образом, мешок для еды может быть 3 кг, 7 кг или 14 кг и может иметь два разных вкуса.Как я могу получить всю эту информацию в одном ряду в удобочитаемом формате?Вот что я попробовал:

SELECT 
  pc.*, p.*, 
  GROUP_CONCAT(DISTINCT o.optionsName) AS optionName, 
  GROUP_CONCAT(og.groupName) AS options 
FROM productCategories pc 
  JOIN products p ON p.productCategoryId=pc.categoryId 
  JOIN productOptions po ON po.categoryRef=pc.categoryId 
  JOIN options o ON o.optionsId=po.optionsRef 
  JOIN optionsGroup og ON og.groupOptionRef=o.optionsId 
WHERE p.productName=:itemName 
  GROUP BY p.productId

Это дает мне одну строку с

....
optionName: 'kg,Flavor',
options: '3,7,14,Chicken,Beef'
....

, что является беспорядком.Можно ли каким-то образом объединить каждый вариант, а затем обработать его проще, не угадывая, какая часть идет в кг / вкус?

Я знаю, что здесь будет легко, но позже будет раздел обзора, который будет ссылаться на этот productId, к которому я также хотел бы присоединиться к этому запросу.Любой совет приветствуется, я открыт для лучшей структуры БД, если она нужна.

1 Ответ

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

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

GROUP_CONCAT(CONCAT(o.optionsName, ': ', og.groupName) ORDER BY o.optionsName, og.groupName) AS options 

Если вы хотите иметь более структурированную структуру, вам нужно выполнить подзапрос (группировка по опциямname и group_concating его групповые имена, затем группировка без имени опции во внешнем запросе);но в этот момент определенно стоит подумать, стоит ли вам просто обрабатывать форматирование и группировать результаты на стороне клиента.

...