Можно ли сделать group_concat внутри другой group_concat? - PullRequest
0 голосов
/ 12 января 2019

Я строю интернет-магазин по продаже обуви. Я пытаюсь написать команду, которая покажет количество каждого размера для 1 конкретного кроссовка.

Это моя ER-диаграмма

Link to my ER-Diagram can be seen here: imgur.com/a/QHpid2p

Я хочу добавить количество (кол-во) ко всем разным размерам, но все, что я пытаюсь, похоже, не работает.

SELECT sn.sneaker_id, sn.sneaker_name,
       (CASE WHEN sn.gender = 0 THEN 'Women'
             WHEN sn.gender = 1 THEN 'Men'
        END) as gender,
       sn.description, sn.price,
       GROUP_CONCAT(si.size),
       GROUP_CONCAT(DISTINCT(i.path)),
       bn.brand_name
FROM sneakers sn JOIN
     sizes si
     ON si.sneaker_fk = sn.sneaker_id JOIN
     images i
     ON i.sneaker_fk = sn.sneaker_id JOIN
     brand_names bn
     ON bn.brand_name_id = sn.brand_name_fk
WHERE sn.sneaker_id = 1

Это мой фактический результат:

sneaker_id : 1
sneaker_name : Air Max 97 Silver Bullet
gender : Men
description : anfaslknsaf
price : 1500
GROUP_CONCAT(sizes.size) : 41.0,43.0,44.0,45.5,46.0
GROUP_CONCAT(DISTINCT(images.path)): img
brand_name : nike

Мой желаемый вывод будет выглядеть примерно так:

sneaker_id : 1
sneaker_name : Air Max 97 Silver Bullet
gender : Men
description : anfaslknsaf
price : 1500
GROUP_CONCAT(sizes.size) : [41.0, 10],[43.0, 5],[44.0, 8],[45.5, 7],[46.0,8]
GROUP_CONCAT(DISTINCT(images.path)): img
brand_name : nike

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Рекомендуется агрегировать по всем неагрегированным столбцам в запросе GROUP BY.

GROUP_CONCAT() принимает несколько аргументов и объединяет их вместе. Итак, вы можете сделать:

SELECT sn.sneaker_id, sn.sneaker_name,
       (CASE WHEN sn.gender = 0 THEN 'Women'
             WHEN sn.gender = 1 THEN 'Men'
        END) as gender,
       sn.description, sn.price,
       GROUP_CONCAT('[', si.size, ', ', si.qty, ']'),
       GROUP_CONCAT(DISTINCT(i.path)),
       bn.brand_name
FROM sneakers sn JOIN
     sizes si
     ON si.sneaker_fk = sn.sneaker_id JOIN
     images i
     ON i.sneaker_fk = sn.sneaker_id JOIN
     brand_names bn
     ON bn.brand_name_id = sn.brand_name_fk
WHERE sn.sneaker_id = 1
GROUP BY sn.sneaker_id, sn.sneaker_name, gender, sn.description, sn.price, bn.brand_name;

Обратите внимание, что вы можете удалить предложение WHERE, и это будет работать для всех идентификаторов кроссовок.

0 голосов
/ 12 января 2019

Вам нужно объединить оба столбца вручную:

GROUP_CONCAT(CONCAT('[', sizes.size, ', ', sizes.qty, ']'))
...