MySQL настроенная группа concat

Мне нужно преобразовать результат моего запроса, чтобы несколько строк с одинаковым внешним ключом были всего одной строкой. Я могу сделать это с помощью группировки. проблема в том, что в одном из моих столбцов я хочу объединить несколько столбцов с разной группировкой. например, в моей таблице есть такие вещи:

shopId     Brand    Category    Color     QTY
----------------------------------------------
15         Dell     NoteBook    Red       5
15         Dell     NoteBook    Blue      1
15         HP       NoteBook    red       2
15         HP       NetBook     red       3
14         Sony     NoteBook    yellow    1
14         Acer     Tablet      red       10

Бренд, Категория и Цвет - все извлекаются из их внешних ключей. Я хочу представить этот результат как

ShopId      Dell    Color             HP    Color    etc...
-----------------------------------------------------------
15          6       red:5, Blue:1     2     red:2    
14 ..............

в своем запросе я сгруппировал их по идентификатору магазина, и найти общее количество для каждой марки и категории с помощью суммы и статистики было несложной задачей. Моя проблема в том, как я могу объединить цвет и количество для магазина, категории, группы брендов (общая группировка выполняется по shopId, а не по магазину, категории, бренду)?

Моя таблица

CREATE TABLE `shopstorage` (
 `color` int(11) NOT NULL,
 `category` int(11) NOT NULL,
 `brand` int(11) NOT NULL,
 `shop` int(11) NOT NULL,
 `date` date NOT NULL,
 `qty` tinyint(4) NOT NULL,
 PRIMARY KEY (`color`,`category`,`brand`,`shop`,`date`),
 KEY `clrEpClr` (`color`),
 KEY `clrEpCat` (`category`),
 KEY `clrEpshop` (`shop`),
 KEY `clrEpBrand` (`brand`),
 CONSTRAINT `SSBrand` FOREIGN KEY (`brand`) REFERENCES `brand` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
 CONSTRAINT `SSCat` FOREIGN KEY (`category`) REFERENCES `productcategory` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
 CONSTRAINT `SSClr` FOREIGN KEY (`color`) REFERENCES `color` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
 CONSTRAINT `SSShop` FOREIGN KEY (`shop`) REFERENCES `shop` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8

и мой неполный запрос

select 
    shop.name, shop.floor, shop.no, 
    sum(case when brand.name ='ASUS' and productcategory.name='NoteBook' then shopstorage.qty else 0 end) as ASUS,
    sum(case when brand.name ='HP' and productcategory.name='NoteBook' then shopstorage.qty else 0 end) as HP,
    sum(case when brand.name ='Sony' and productcategory.name='NoteBook' then shopstorage.qty else 0 end) as Sony,
    sum(case when brand.name ='Dell' and productcategory.name='NoteBook' then shopstorage.qty else 0 end) as Dell,
    sum(case when brand.name ='ASUS' and productcategory.name='NetBook' then shopstorage.qty else 0 end) as ASUS,
    sum(case when brand.name ='HP' and productcategory.name='NetBook' then shopstorage.qty else 0 end) as HP,
    sum(case when brand.name ='Sony' and productcategory.name='NetBook' then shopstorage.qty else 0 end) as Sony,
    sum(case when brand.name ='Dell' and productcategory.name='NetBook' then shopstorage.qty else 0 end) as Dell,
    sum(case when brand.name ='ASUS' and productcategory.name='Tablet' then shopstorage.qty else 0 end) as ASUS,
    sum(case when brand.name ='HP' and productcategory.name='Tablet' then shopstorage.qty else 0 end) as HP,
    sum(case when brand.name ='Sony' and productcategory.name='Tablet' then shopstorage.qty else 0 end) as Sony,
    sum(case when brand.name ='Dell' and productcategory.name='Tablet' then shopstorage.qty else 0 end) as Dell
from shopstorage 
    join brand on shopstorage.brand=brand.id
    join color on shopstorage.color=color.id
    join productcategory on shopstorage.category=productcategory.id
    join shop on shop.id = shopstorage.shop
group by shopstorage.shop

Я ищу способ добавить столбец после каждой суммы для указания количества каждого цвета, например, если HP равно 15 У него есть 7 красных и 8 синих ноутбуков. Я попробовал GROUP_Concat, но он не показывал правильный результат из-за неправильной группировки.


person Soheil    schedule 13.08.2012    source источник
comment
Вам нужен поворот. Найдите SO для этого термина   -  person Bohemian♦    schedule 13.08.2012
comment
Я это уже искал. но танки :)   -  person Soheil    schedule 13.08.2012
comment
Покажите нам структуру вашей таблицы (результат SHOW CREATE TABLE your_table) и ваш запрос на данный момент.   -  person Jocelyn    schedule 13.08.2012
comment
@Jocelyn Я добавил их в конец вопроса   -  person Soheil    schedule 13.08.2012
comment
Это немного похоже на попытку снова использовать SQL как полный по Тьюрингу язык. Некоторые вещи лучше делать в коде приложения, чем в SQL. Вот и все. (т.е. вы можете добиться этого, но это не очень гибко, поэтому обслуживание может быть сложным - код приложения может справиться с этим более изящно)   -  person Romain    schedule 13.08.2012
comment
@Romain: Я уже достиг этого с помощью вложенных fors в моем приложении. но моя проблема в том, что, поскольку этот результат должен быть присоединен к другим таблицам, я должен выполнить другой запрос для каждой строки. и другая проблема заключается в том, что я хочу выполнить разбиение на страницы моего результата, но поскольку моя первая таблица содержит что-то вроде 15,15,15,15,14,14, .... Я не знаю, как установить предел и его смещение: Д. например, лимит 20,0 может возвращать данные о 2 магазинах или 2,5 магазинах. а пока я работаю над комбинациями этих двух методов. Спасибо всем за ваши комментарии :)   -  person Soheil    schedule 14.08.2012
comment
@Soheil Я бы тогда подумал, что структура таблицы должна быть переработана, если это возможно, чтобы лучше соответствовать варианту использования. Или вы можете попытаться выполнить поворот (намного) позже, если это сработает.   -  person Romain    schedule 14.08.2012
comment
@Romain Я использовал ,group_concat(case when brand.name='{$brand['name']}' and category={$category['id']} then concat(color.name,':',num) end) as {$brand['name']}C в моем коде после каждой суммы, и он сделал трехколесный велосипед: D   -  person Soheil    schedule 14.08.2012


Ответы (1)


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

,group_concat(case when brand.name='{$brand['name']}' and category={$category['id']} then concat(color.name,':',num) end) as {$brand['name']}C

{$ brand ['name']} и {$ category ['id']} - это переменные в моем PHP-коде для итерации между брендами и категориями. Я не знаю, почему мне потребовалось так много времени, чтобы найти такое простое решение: P позор мне: D

person Soheil    schedule 14.08.2012