MySQL JOIN & Split String - PullRequest
       5

MySQL JOIN & Split String

3 голосов
/ 29 августа 2010

Я хочу присоединиться к двум столам. Нет проблем с этим. У меня проблема с совершенно другой вещью.

Вот мой код:

SELECT * FROM `table1`
JOIN `table2` ON `table1.`field`=`table2`.`field`
...

Основная проблема заключается в том, что table1.field - это строка, разделенная запятыми. Есть ли хороший и быстрый способ разбить его?

Обновление
Я нашел функцию Федерико Кагнелутти

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

Использование:

SELECT SPLIT_STR('a|bb|ccc|dd', '|', 3) as third;

Довольно полезно, но в качестве третьего параметра требуется целое число позиции. Во всяком случае, я не знаю количество слов, разделенных запятыми. По сути, это до 20 слов, но я не знаю, сколько.

Обновление 2 Чтобы уточнить мой вопрос. Вот что мне нравится (я знаю, что следующий запрос неверен):

SELECT * FROM `table1`
JOIN `table2` ON `table2`.`id` IN (`table1`.`field`)

Обновление 3
Примеры строк: table1.field = '202, 185, 505', table2.field = 202

1 Ответ

1 голос
/ 29 августа 2010

Я не уверен, что точно понимаю, что вам нужно, но, возможно, вы могли бы использовать функцию FIND_IN_SET ?

SELECT * FROM `table1`
JOIN `table2` ON FIND_IN_SET( `table2`.`field`, `table1.`field` ) > 0

Хотя производительность может быть проблемой с этим.

Обновление:

Если у вас есть начальные пробелы в данных, как в приведенном примере, это может быть обработано с помощью REPLACE . Это не будет работать там, где есть встроенные пробелы, но будет обслуживать случаи, когда иногда есть ведущие пробелы, а иногда нет. Пример:

SELECT  *
FROM    table1 t1
JOIN    table2 t2
ON      FIND_IN_SET( t2.field, REPLACE( t1.field, ' ', '' ) ) > 0

В наборе имеется ограничение на 64 члена, поэтому, если строка с разделителями-запятыми будет длинной, она сломается.

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