Mysql получить список столбцов через запятую

У меня есть колонка с аксессуарами продуктов, как показано ниже:

ТАБЛИЦА 1

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

Это означает, что для ПРОДУКТА 2 у него есть идентификаторы продуктов аксессуаров 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

но я хочу изменить productID в t2.accessories с помощью символа GRP вместо этого в соответствии с t2.ProductID, чтобы таблица FINAL выглядела следующим образом.

ТАБЛИЦА 2

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

Я действительно запутался, как сделать это правильно, я смог справиться с этим с помощью PHP-кода, но это занимает много времени, потому что у меня есть 100 000 продуктов, поэтому я предпочитаю использовать некоторые group_concat или concat_ws для обработки этого

и некоторые t2.accessories уже могут быть сохранены, поэтому это должны быть разные значения, поэтому в таблице 2 нет дубликатов t2.accessories.

Вот таблицы http://sqlfiddle.com/

2 ответа

Вы должны исправить свою структуру данных, чтобы иметь соединительную таблицу. Не храните списки в виде строк. SQL имеет очень хороший способ хранения списков; это называется стол. Не храните числа в виде строк. SQL имеет очень хорошие типы данных для чисел. Они не содержат "char" в их имени.

Есть способ сделать то, что вы хотите в базе данных, но вы не можете пожаловаться на производительность. Правильно структурируйте свои данные, и они пойдут быстрее.

Запрос select, который выполняет конкатенацию, выглядит следующим образом:

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

Единственная проблема, если у вас большое количество строк, это займет много времени

Другие вопросы по тегам