MySQL自定义组concat
我需要转换我的查询结果,所以具有相同外键的多行只能是一行。 我可以通过分组来做到这一点。问题是,在我的一个列中,我想用不同的分组连接一些列。 例如,我的表格包含如下内容:MySQL自定义组concat,mysql,group-concat,Mysql,Group Concat,我需要转换我的查询结果,所以具有相同外键的多行只能是一行。 我可以通过分组来做到这一点。问题是,在我的一个列中,我想用不同的分组连接一些列。 例如,我的表格包含如下内容: shopId Brand Category Color QTY ---------------------------------------------- 15 Dell NoteBook Red 5 15 Dell NoteBoo
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对它们进行了分组,使用sum和case statment查找每个品牌和类别的总数量是一件容易的工作。我的问题是如何连接店铺、类别、品牌分组的颜色和数量(总分组是按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
创建表“shopstorage”(
`颜色'int(11)不为空,
`类别'int(11)不为空,
`商标'int(11)不为空,
`shop`int(11)不为空,
`日期`日期不为空,
`数量'tinyint(4)不为空,
主键(`color`、`category`、`brand`、`shop`、`date`),
键'clrEpClr'('color'),
键'clrEpCat'('category`),
键'clrEpshop'('shop'),
键“clrEpBrand”(“brand”),
约束`SSBrand`外键(`brand`)在删除时引用`brand`(`id`),在更新时不执行任何操作,
约束`SSCat`外键(`category`)在删除时引用`productcategory`(`id`),在更新时不执行任何操作,
约束`SSClr`外键(`color`)在删除时引用`color`(`id`),在更新时不操作,
约束`SSShop`外键(`shop`)在删除时引用`shop`(`id`),在更新时不执行任何操作
)引擎=InnoDB默认字符集=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
挑选
店铺名称、店铺楼层、店铺编号、,
求和(当brand.name='ASUS'和productcategory.name='NoteBook'然后shopstorage.qty else 0结束时的情况)为ASUS,
总和(当brand.name='HP'和productcategory.name='NoteBook'然后shopstorage.qty else 0结束时的情况)为HP,
sum(brand.name='Sony'和productcategory.name='NoteBook'以及shopstorage.qty else 0结束时的情况)为Sony,
总和(当brand.name='Dell'和productcategory.name='NoteBook'然后shopstorage.qty else 0结束时的情况)为Dell,
求和(当brand.name='ASUS'和productcategory.name='NetBook'然后shopstorage.qty else 0结束时的情况)为ASUS,
总和(当brand.name='HP'和productcategory.name='NetBook'然后shopstorage.qty else 0结束时的情况)为HP,
总和(brand.name='Sony'和productcategory.name='NetBook'以及shopstorage.qty else 0结束时的情况)为索尼,
sum(brand.name='Dell'和productcategory.name='NetBook'然后shopstorage.qty else 0 end)作为Dell,
合计(当brand.name='ASUS'和productcategory.name='Tablet'然后shopstorage.qty else 0结束时的情况)为ASUS,
总和(当brand.name='HP'和productcategory.name='Tablet'然后shopstorage.qty else 0结束时的情况)为HP,
总和(brand.name='Sony'和productcategory.name='Tablet'然后shopstorage.qty else 0结束时的情况)为索尼,
合计(当brand.name='Dell'和productcategory.name='Tablet'然后shopstorage.qty else 0结束时的情况)为Dell
从商店仓库
在shopstorage上加入品牌。品牌=品牌.id
在shopstorage.color=color.id上加入颜色
加入shopstorage上的productcategory.category=productcategory.id
在shop.id=shopstorage.shop上加入店铺
按商店分组存储
我正在寻找一种方法,在每个总和后添加一列,用于指定每个颜色的数量。例如,如果HP是15,它有7个红色和8个蓝色笔记本。我尝试了GROUP_Concat,但由于分组错误,结果不正确。我找到了答案,希望与其他人分享。 我在每次求和后的查询中添加了以下代码
,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你想要一个“支点”。搜索那个词我已经搜索过了。但tanks:)向我们展示您的表结构(Show CREATE table your_table的结果)和您到目前为止的查询。@Jocelyn我将它们添加到问题的末尾,这有点像再次尝试使用SQL作为图灵完整语言。有些东西在应用程序代码中比在SQL中做得更好。仅此而已。(也就是说,您可以实现它,但它不是很灵活,因此维护可能很复杂-应用程序代码可以更优雅地处理此问题)