簡體   English   中英

如何使用Group_concat獲取每個產品的類別列表?

[英]How to use Group_concat to get a list of categories for each product?

我有一個基於OpenCart 3的多語言網站,下面包括了必要的表格和SQLFiddle。

我需要每個產品的逗號分隔category name列表,如下所示:
product_id, language_id, product_name
其中product_name是用逗號分隔的類別列表。 產品名稱示例: Nightgown, Wrap robes, 2li
實際上是類別: 8, 188, 192

重要說明:最后,我想用上面用逗號分隔的類別列表填充product_description表的name列。

似乎我應該使用GROUP_CONCAT ,但是即使我花了半天以上的時間,它也遠遠超出了我的SQL知識。

這是SQLFiddle: http ://sqlfiddle.com/#!9/0337c3

架構

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
    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);

SqlFiddle

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM