0

我需要转换我的查询结果,所以具有相同外键的多行只是一行。我可以通过分组来做到这一点。问题是,在我的一个专栏中,我想连接一些具有不同分组的列。例如,我的表包含这样的 somting:

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

Brand、Category 和 Color 都从它们的外键中检索到。我想呈现这个结果

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

在我的查询中,我按 shopId 对它们进行分组,并使用 sum 和 case 语句查找每个品牌和类别的总数量是一件容易的事。我的问题是如何连接商店、类别、品牌分组的颜色和数量(总分组是按 shopId 而不是商店、类别、品牌)?

我的表是

创建表`shopstorage`(
 `color` int(11) NOT NULL,
 `category` int(11) NOT NULL,
 `brand` int(11) NOT NULL,
 `shop` int(11) NOT NULL,
 `date` 日期不为空,
 `qty` tinyint(4) 非空,
 PRIMARY KEY (`color`,`category`,`brand`,`shop`,`date`),
 KEY `clrEpClr` (`color`),
 KEY `clrEpCat` (`category`),
 KEY `clrEpshop` (`shop`),
 KEY `clrEpBrand`(`品牌`),
 CONSTRAINT `SSBrand` FOREIGN KEY (`brand`) REFERENCES `brand` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
 约束 `SSCat` 外键 (`category`) 参考 `productcategory` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
 约束 `SSClr` 外键 (`color`) 参考 `color` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
 约束 `SSShop` 外键 (`shop`) 参考 `shop` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) 引擎=InnoDB 默认字符集=utf8

我的不完整查询是

选择
    shop.name, shop.floor, shop.no,
    总和(当brand.name ='ASUS' and productcategory.name='NoteBook' then shopstorage.qty else 0 end)作为华硕,
    总和(当brand.name ='HP'和productcategory.name='NoteBook'然后shopstorage.qty else 0结束时)作为HP,
    总和(当brand.name ='Sony'和productcategory.name='NoteBook'然后shopstorage.qty else 0结束时)作为索尼,
    总和(当brand.name ='Dell'和productcategory.name='NoteBook'然后shopstorage.qty else 0结束时)作为戴尔,
    总和(当brand.name ='ASUS' and productcategory.name='NetBook' then shopstorage.qty else 0 end)作为华硕,
    总和(当brand.name ='HP' and productcategory.name='NetBook' then shopstorage.qty else 0 end)作为HP,
    总和(当brand.name ='Sony'和productcategory.name='NetBook'然后shopstorage.qty else 0结束时)作为索尼,
    sum(当brand.name ='Dell'和productcategory.name='NetBook'然后shopstorage.qty else 0结束时)作为戴尔,
    总和(当brand.name ='ASUS' and productcategory.name='Tablet' then storestorage.qty else 0 end)作为华硕,
    总和(当brand.name ='HP' and productcategory.name='Tablet' then stores.qty else 0 end)作为HP,
    sum(当brand.name ='Sony'和productcategory.name='Tablet'然后shopstorage.qty else 0结束时)作为索尼,
    总和(当brand.name ='Dell' and productcategory.name='Tablet' then storesstorage.qty else 0 end)作为戴尔
从商店存储
    在 shoptorage.brand=brand.id 上加入品牌
    在 shoptorage.color=color.id 上加入颜色
    在 shoptorage.category=productcategory.id 上加入产品类别
    在 shop.id = shopstorage.shop 上加入商店
按商店storage.shop 分组

我正在寻找一种在每次总和后添加一列以指定每种颜色数量的方法,例如,如果 HP 为 15,它有 7 个红色和 8 个蓝色笔记本。我尝试了 GROUP_Concat 但由于分组错误,它没有显示正确的结果。

4

1 回答 1

0

我找到了答案,并想与他人分享。我在每次总和后的查询中添加了以下代码

,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

于 2012-08-14T07:42:17.290 回答