your data
CREATE TABLE mytable1(
id VARCHAR(100) NOT NULL
,id_related VARCHAR(100) NOT NULL
);
INSERT INTO mytable1
(id,id_related) VALUES
('id1','[id2,id3,id4]'),
('id2','[id1,id4]'),
('id3','[id1,id2,id5]');
CREATE TABLE mytable2(
id VARCHAR(100) NOT NULL
,country VARCHAR(100) NOT NULL
);
INSERT INTO mytable2(id,country) VALUES
('id1','BR'),
('id2','US'),
('id3','CO'),
('id4','IT'),
('id5','US');
first of all you should remove [ ]
characters by using following query
SELECT id,
Trim(BOTH '[' FROM Trim(BOTH ']' FROM id_related)) AS id_related
FROM table1
output result
id |
id_related |
id1 |
id2,id3,id4 |
id2 |
id1,id4 |
id3 |
id1,id2,id5 |
then you should use the approach used in this link to split values to multiple rows
SELECT t12.id,
t2.country
FROM (SELECT t11.id,
Substring_index(Substring_index(t11.id_related, ',', numbers.n),
',', -1
)
id_related
FROM (SELECT 1 n
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5) numbers
INNER JOIN (SELECT id,
Trim(BOTH '[' FROM Trim(BOTH ']' FROM
id_related)) AS
id_related
FROM table1) t11
ON Char_length(t11.id_related) - Char_length(
REPLACE(t11.id_related, ','
, '')) >=
numbers.n - 1) t12
JOIN table2 t2
ON t2.id = t12.id_related
to get following result
id |
id_related |
id3 |
id1 |
id2 |
id1 |
id1 |
id2 |
id3 |
id2 |
id2 |
id4 |
id1 |
id3 |
id3 |
id5 |
id1 |
id4 |
then use GROUP_CONCAT
,Concat
and multiple join
and Subquery
to get your desired result as follows
SELECT t12.id,
t13.id_related,
Concat('[', Group_concat(t2.country ORDER BY t12.id_related ASC), ']') AS
related_country
FROM (SELECT t11.id,
Substring_index(Substring_index(t11.id_related, ',', numbers.n),
',', -1
)
id_related
FROM (SELECT 1 n
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5) numbers
INNER JOIN (SELECT id,
Trim(BOTH '[' FROM Trim(BOTH ']' FROM
id_related)) AS
id_related
FROM table1) t11
ON Char_length(t11.id_related) - Char_length(
REPLACE(t11.id_related, ','
, '')) >=
numbers.n - 1) t12
JOIN table2 t2
ON t2.id = t12.id_related
JOIN table1 t13
ON t13.id = t12.id
GROUP BY t12.id,
t13.id_related
dbfiddle