Объединить через запятую значения в MySQL - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть MySQL Table вроде этого

Таблица 1

1    [1803,1605]
2    [1605]
3    [1405,989]

Таблица 2

1803 List_item_1
1605 item_2
1405 item_3

и так далее

Я должен получитьвывод вроде

1  List_item_1,item_2
2  item_2

и т. д.

Пожалуйста, помогите мне с этим

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Снимите скобки и используйте FIND_IN_SET:

SELECT t1.id, GROUP_CONCAT(t2.name SEPARATOR ',')
FROM t1
JOIN t2 ON FIND_IN_SET(t2.id, TRIM(TRAILING ']' FROM TRIM(LEADING '[' FROM t1.csv))) > 0
GROUP BY t1.id

Демонстрация на db <> fiddle

0 голосов
/ 28 февраля 2019

Для MySQL 5.7 и более новых версий вы можете использовать JSON_CONTAINS() в предложении ON:

select t1.id, group_concat(t2.name) as names
from table1 t1
join table2 t2 on json_contains(t1.categories, cast(t2.categoryid as json))
group by t1.id

Демо: https://www.db -fiddle.com / f / odnDBDagYSdJvcK1P2TCMd / 0

Но вы должны рассмотреть вопрос о хранении ваших данных в нормализованной схеме.Поскольку это отношение многие ко многим , вам понадобится третья таблица, такая как

items_cats: 
------------------
item_id     cat_id
------------------
      1       1803
      1       1605
      2       1605
      3       1405

Тогда ваш запрос будет:

select ic.item_id, group_concat(t2.name) as names
from items_cats ic
join table2 t2 on t2.categoryid = ic.cat_id
group by ic.item_id

Демонстрация: https://www.db -fiddle.com / f / izHPHaV5iLsNvVnAfZs3Jo / 0

Этот метод может использовать индекс для JOIN и значительно повышает производительность при увеличении размера данных.

0 голосов
/ 28 февраля 2019

Я использую упрощенное сопоставление здесь для идентификатора категории, который зависит от их примерно одинаковой длины

SELECT id, GROUP_CONCAT(name)
FROM tableA a
JOIN tableB b ON  a.categories LIKE CONCAT('%',b.categoryId, '%')
GROUP BY id

, и вот один вариант с использованием REGEXP_LIKE, который должен быть немного более гибким

SELECT id, GROUP_CONCAT(name)
FROM tableA a
JOIN tableB b ON  REGEXP_LIKE(a.categories, CONCAT('[\\[,]+', b.categoryId, '[\\],]+'))
GROUP BY id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...