2012-08-13 3 views
0

Мне нужно преобразовать результат моего запроса, поэтому несколько строк с одним и тем же внешним ключом будут только одной строкой. Я могу сделать это с группировкой. проблема в том, что в одном из моих столбцов я хочу объединить некоторые столбцы с разной группировкой. , например, мой стол содержит somting так: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 и найти общее Количество для каждой марки и категории, используя сумму и случай Постулаты была легкой работу. моя проблема заключается в том, как я могу конкатенировать цвет и количество для магазина, категории, группировки брендов (общая группировка осуществляется по магазинам, а не в магазине, категории, бренде)?

Мой tabale является

 
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 

и мой incomplet запрос

 
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 

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

+0

Вы хотите «поворот». Поиск SO для этого термина – Bohemian

+0

Я уже искал это. но танки :) – Soheil

+0

Покажите нам свою структуру таблицы (результат 'SHOW CREATE TABLE your_table') и ваш запрос до сих пор. – Jocelyn

ответ

0

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

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

{$ бренд [ «имя»]} и {$ категории [ «ID»]} являются переменными в моем PHP код для итерация между марками и категориями Я не знаю, почему так долго понадобилось мне найти такое легкое решение: P стыд на мне: D

Смежные вопросы