簡體   English   中英

Mysql獲取逗號分隔的列列表

[英]Mysql get comma separated list of columns

我有一個包含產品配件的列,如下例所示:

表格1

ProductID    accessories
1            2,3  
2            1,4,5
3
4            1
5            2

這意味着對於 PRODUCT 2,它的配件產品 ID 為 1,4 和 5

我有下面的最終表 2,看起來像這樣

表2

GRP     ProductID     accessories 
a       2             
b       3             
c       1             
d       4             
e       5 

所以實際上如果使用 UPDATE 它會是這樣的

表2

UPDATE table t2
INNER JOIN table1 t1
On t2.ProductID = t1.ProductID
set t2.accessories = t1.accessories 

GRP     ProductID     accessories
a       2             1,4,5
b       3              
c       1             2,3
d       4             1
e       5             2

但我想根據 t2.ProductID 使用 GRP 字符更改 t2.accessories 中的 productID,以便最終表看起來像這樣。

表2

GRP     ProductID     accessories
a       2             c,d,e
b       3              
c       1             a,b
d       4             c
e       5             a

我真的很困惑如何正確地做到這一點我能夠使用 php 代碼處理這個問題,但是需要很長時間,因為我有 10 萬個產品,因此我更喜歡使用一些 group_concat 或 concat_ws 來處理這個

並且一些 t2.accessories 可能已經存儲,因此它應該是不同的值,所以 table2 上沒有重復的 t2.accessories

這是表http://sqlfiddle.com/#!9/bfddf

您應該修復數據結構以獲得連接表。 不要將列表存儲為字符串。 SQL 有一種非常好的存儲列表的方法; 它被稱為表。 不要將數字存儲為字符串。 SQL 具有非常好的數字數據類型。 它們的名稱中不包含“char”。

有一種方法可以在數據庫中做您想做的事,但您不能抱怨性能。 正確構建您的數據,它會運行得更快。

執行連接的選擇查詢如下所示:

select t1.productid,
       group_concat(t2.productid order by find_in_set(t2.ProductId, t1.accessories))
from table1 t1 join
     table2 t2
     on find_in_set(t2.ProductId, t1.accessories) > 0
group by t1.productid;

但是,您應該真正修復您的數據結構。

這如我所願。

UPDATE table2 
INNER JOIN ( 
            select t1.productid, group_concat(t2.GRP order by find_in_set(t2.GRP, t1.accessories)) as test from table1 t1 
            join table2 t2 on find_in_set(t2.ProductId, t1.accessories) > 0 group by t1.productid
            ) as temp on table2.ProductId=temp.productid
set table2.accessories=temp.test

唯一的問題是,如果你有大量的行,這將需要很長時間

暫無
暫無

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

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