Сопоставление подстрок из значения с разделителями в одной таблице с записями во второй таблице и построение объединения - PullRequest
1 голос
/ 29 января 2020

Я недавно выгрузил записи из старой CRM в базу данных Navicat (MySQL) в виде двух таблиц.

__________________
| table_1:       |
|----------------|
| id             |
| delimited_col  |
------------------

__________________
| table_2:       |
|----------------|
| id             |
| name           |
------------------

Информация:

  • Таблица 1:
    • table_1.delimited_col состоит из объединенных имен, разделенных знаком ";"

      ex из записи: "Кевин; Нэнси; Джеймс; Барт; Делани"

  • Таблица 2:
    • table_2 .name состоит из отдельных имен

      ex из записи: "kevin"

Моя цель:

  • Создайте таблицу соединений (table_3), которая проверяет каждую запись в table_1.delimited_col, чтобы узнать, содержат ли они значение из table_2.name.
    • Если запись в table_1.delimited содержит подстроку, найденную в table_2.name, добавьте эту запись из идентификатора table_1 и соответствующую запись из идентификатора table_2 в объединение table_3.
__________________
| join_table:    |
|----------------|
| id             |
| table_1_id     |
| table_2_id     |
------------------

Я бился головой о стену, пытаясь понять это, и был бы признателен за любую помощь или совет!

1 Ответ

2 голосов
/ 29 января 2020

Вы можете использовать строковый метод find_in_set():

select t1.id table_1_id, t2.id table_2_id
from table_1 t1
inner join table_2 t2 on find_in_set(t2.name, replace(t1.delimited_col, ';', ','))

Но, что еще лучше, вы должны действительно исправить свою модель данных и сохранить каждое значение в список с разделителями в отдельной строке таблицы. Хранение данных CSV в реляционных базах данных не является хорошей практикой и может повредить вам во многих отношениях. Здесь - это известный пост SO, в котором подробно рассматриваются эти топики c - на самом деле многие вопросы, связанные со списками с разделителями, закрываются как дубликаты к этому посту здесь, на SO.

Если вы хотите создать новую таблицу с результатами запроса, то:

create table table_3(id int auto_increment, table_1_id, table_2_id);

insert into table_3 (table_1_id, table_2_id)
select t1.id, t2.id
from table_1 t1
inner join table_2 t2 on find_in_set(t2.name, replace(t1.delimited_col, ';', ','));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...