Mysql 如何使用Group_concat获取每个产品的类别列表?
我有一个基于OpenCart 3的多语言网站,我在下面为它提供了必要的表格和SQLFIDLE 我需要每个产品的一个逗号分隔的Mysql 如何使用Group_concat获取每个产品的类别列表?,mysql,group-concat,opencart-3,Mysql,Group Concat,Opencart 3,我有一个基于OpenCart 3的多语言网站,我在下面为它提供了必要的表格和SQLFIDLE 我需要每个产品的一个逗号分隔的类别名称列表,如下所示: 产品标识、语言标识、产品名称 其中,product\u name是以逗号分隔的类别列表。 产品名称示例:睡衣、裹袍、2li 哪些实际上是类别:8188192 重要提示:最后,我想用我上面解释的逗号分隔的类别列表填充产品描述表的名称列 似乎我应该使用GROUP\u CONCAT,但这远远超出了我的SQL知识,尽管我花了半天以上的时间 这是SQLFid
类别名称列表,如下所示:
产品标识、语言标识、产品名称
其中,product\u name
是以逗号分隔的类别列表。
产品名称示例:睡衣、裹袍、2li
哪些实际上是类别:8188192
重要提示:最后,我想用我上面解释的逗号分隔的类别列表填充产品描述表的名称
列
似乎我应该使用GROUP\u CONCAT
,但这远远超出了我的SQL知识,尽管我花了半天以上的时间
这是SQLFiddle:
模式
CREATE TABLE `category` (
`category_id` int(11) NOT NULL,
`parent_id` int(11) NOT NULL DEFAULT '0'
)
CREATE TABLE `category_description` (
`cd_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
`language_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL
)
CREATE TABLE `language` (
`language_id` int(11) NOT NULL,
`name` varchar(32) NOT NULL,
`code` varchar(5) NOT NULL,
`locale` varchar(255) NOT NULL,
`image` varchar(64) NOT NULL,
`directory` varchar(32) NOT NULL,
`sort_order` int(3) NOT NULL DEFAULT '0',
`status` tinyint(1) NOT NULL
)
CREATE TABLE `product` (
`product_id` int(11) NOT NULL,
`model` varchar(64) NOT NULL,
`price` decimal(15,4) NOT NULL DEFAULT '0.0000'
)
CREATE TABLE `product_description` (
`product_id` int(11) NOT NULL,
`language_id` int(11) NOT NULL
)
CREATE TABLE `product_to_category` (
`product_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL
)
ALTER TABLE `category`
ADD PRIMARY KEY (`category_id`,`parent_id`),
ADD KEY `parent_id` (`parent_id`);
ALTER TABLE `category_description`
ADD PRIMARY KEY (`cd_id`,`category_id`,`language_id`),
ADD KEY `name` (`name`);
ALTER TABLE `language`
ADD PRIMARY KEY (`language_id`),
ADD KEY `name` (`name`);
ALTER TABLE `product`
ADD PRIMARY KEY (`product_id`);
ALTER TABLE `product_description`
ADD PRIMARY KEY (`product_id`,`language_id`),
ADD KEY `name` (`name`);
ALTER TABLE `product_to_category`
ADD PRIMARY KEY (`product_id`,`category_id`),
ADD KEY `category_id` (`category_id`);
ALTER TABLE `category`
MODIFY `category_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=202;
ALTER TABLE `category_description`
MODIFY `cd_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=961;
ALTER TABLE `language`
MODIFY `language_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
ALTER TABLE `product`
MODIFY `product_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=85;
如果您能告诉我问题出在哪里,我将不胜感激。您可以使用以下select语句:
select
pd.product_id,
pd.language_id,
group_concat(cd.name order by cd.language_id separator ', ') as product_name
from product_description pd
left join product_to_category pc using (product_id)
left join category_description cd using (category_id, language_id)
group by pd.product_id, pd.language_id
我认为在新列中存储冗余数据不是一个好主意。但您可以通过以下方式实现:
update product_description pd
join (
select
pd.product_id,
pd.language_id,
group_concat(cd.name order by cd.language_id separator ', ') as product_name
from product_description pd
left join product_to_category pc using (product_id)
left join category_description cd using (category_id, language_id)
group by pd.product_id, pd.language_id
) sub using (product_id, language_id)
set pd.name = sub.product_name;
以下查询应该可以工作:
select pd.product_id, pd.language_id,group_concat(distinct cd.name separator ',') as Product_name
from product_description pd
inner join product_to_category pc
on pc.product_id = pd.product_id
inner join category_description cd
on pc.category_id = cd.category_id and pd.language_id = cd.language_id
group by pd.product_id, pd.language_id;
要更新表,请执行以下操作:
Update product_description p
set p.name = (select group_concat(distinct cd.name separator ',') as Product_name
from (select *from product_description) pd
inner join product_to_category pc
on pc.product_id = pd.product_id
inner join category_description cd
on pc.category_id = cd.category_id and pd.language_id = cd.language_id
group by pd.product_id, pd.language_id
having p.product_id = pd.product_id and p.language_id = pd.language_id);
希望有帮助 您想查看产品名称还是类别名称?@Harshil:category name请查看以下内容,并评论其是否提供了所需的结果:非常感谢您的帮助。同时,保罗给出了同样的答案,包括插入一个。再次感谢,祝你好运!是 啊我刚刚看到了公认的答案。差不多。谢谢你的支持。嗨,保罗,丹克·肖恩,太好了!你救了我的时间和勇气!我被这个问题弄疯了。