Как сделать Join в MySql на основе частичных совпадений? - PullRequest
2 голосов
/ 08 июня 2011

У меня есть две таблицы.

Таблица A

Column 1     Column 2
CT 3C        10.5 -23.12
OT 5A        11.2 -24.5

Таблица B

Column 1     Column 2
PRIM         12.3 -24.51, 10.5 -23.12, 61.24 -78.23
SEC          8.7345 -46.1934, 10.49 -49.1834
TERT         18.98 -28.12, 11.23 -24.78, 1.45 -24.11, 11.2 -24.5

Результирующая таблица после объединения:

Column 1      Column 2      Column 3     Column 4
CT 3C         10.5 -23.12   PRIM         12.3 -24.51, 10.5 -23.12, 61.24 -78.23
OT 5A         11.2 -24.5    TERT         18.98 -28.12, 11.23 -24.78, 1.45 -24.11, 11.2 -24.5

Есть ли способ этого матчабез разделения содержимого столбца 2 в таблице B на отдельные столбцы?Содержимое в столбце 2 таблицы B ограничено знаком «,».

10,5 -23,12 должен совпадать с 12,3 -24,51, 10,5 -23,12 , 61,24 -78,23, поскольку он содержится в списке значений, присутствующих в нем.

Я не могу разделить их на отдельные столбцы, потому что в некоторых случаях в нем содержится до 300 различных значений, разделенных символом ','

Ответы [ 5 ]

7 голосов
/ 08 июня 2011

Краткосрочное решение

Используйте функцию FIND_IN_SET :

SELECT a.column1, a.column2,
       b.column1, b.column2
  FROM TABLE_A a
  JOIN TABLE_B b ON FIND_IN_SET(a.column2, b.column2) > 0

Долгосрочное решение

Денормализованные данные должны храниться только в целях повышения производительности, после это было определено как необходимое - не до.

Вам нужна таблица «многие ко многим» между TABLE_A и TABLE_B для хранения отношений, представленных в разделенных запятыми списках.

2 голосов
/ 08 июня 2011

В качестве попытки дать вам то, что вы просите, приведите запрос ниже. Однако, если есть десятки или сотни тысяч значений, я не испытываю оптимизма по поводу его производительности.

select a.col1 as col1, a.col2 as col2, b.col1 as col3, b.col2 as col4
from tableA a
join tableB b
 on (b.col2 like a.col2 + '%' 
      or b.col2 like '%,' + a.col2 + ',%'
      or b.col2 like '%' + a.col2)

Три или условия - это то, где значением является первое значение, последнее значение или любое среднее значение. Вы не можете просто сказать '%' + a.col2 + '%', потому что теоретически он может соответствовать части набора чисел, а не всему значению. то есть %11.2 -24.5% может соответствовать 111.2 -24.56.

1 голос
/ 08 июня 2011

Подобно этому вопросу , функция FIND_IN_SET , предложенная Шакти Сингх , должна работать для вас.Однако я думаю, что это будет невероятно медленно, если в одном столбце столько значений.

Лучше было бы создать дочернюю таблицу.

0 голосов
/ 08 июня 2011

Хотя я согласен с ответами, которые предлагают нормализовать базу данных, я хотел бы отметить, что если вы не состоите в браке с MySQL, у Postgresql есть тип массива с предикатом ANY (), который делает то, что вы хотите.Однако, помимо философских вопросов, если вы нормализуете эту ситуацию, показатели, вероятно, также дадут вам превосходную производительность.AFAIK, версия массива не может быть проиндексирована с пользой.

0 голосов
/ 08 июня 2011

300 различных значений Это явно не поле. Вложенная таблица, может быть, лучше назвать ее.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...