Строка MySQL для установки и получения пересечения

У меня есть база данных с плохим прогнозом, в которой есть наборы идентификаторов в текстовых столбцах, таких как «1,2,5,10». Мне нужно получить пересечение двух столбцов, которые установлены одинаково. Мне не нравится делать это с помощью PHP или другого языка сценариев, мне также не нравятся пользовательские функции MySQL. Есть ли способ получить пересечение двух наборов, заданных строками с разделителями-запятыми?

На самом деле мне не нужно полное пересечение, мне просто нужно знать, есть ли одинаковые числа в двух наборах. Если да, мне нужно иметь «1», если нет такого же числа, мне нужно иметь «0».

Спасибо.


person Epsiloncool    schedule 07.09.2012    source источник
comment
Сколько значений можно объединить? Есть ли предел?   -  person Madhivanan    schedule 07.09.2012
comment
@Madhivanan Конечно, существует не более 20 значений, разделенных запятыми.   -  person Epsiloncool    schedule 07.09.2012
comment
У вас плохие данные, но вы не любите использовать типовые решения таких проблем... почему бы и нет?   -  person eggyal    schedule 07.09.2012


Ответы (2)


Вы можете использовать REGEXP, чтобы сделать это с небольшой умной заменой.

Думаю, это должно сделать это (отказ от ответственности: не тестировал его широко):

SELECT col1,
       col2,
       CONCAT('(', REPLACE(col2, ',', '(\\,|$)|'), '(\\,|$))') AS regex,
       col1 REGEXP CONCAT('(', REPLACE(col2, ',', '(\\,|$)|'), '(\\,|$))') AS intersect
FROM tbl

См. http://sqlfiddle.com/#!2/7b86f/3.

Чтобы объяснить: это преобразует col2 в регулярное выражение для сопоставления с col1. Бит (\,|$) соответствует либо запятой, либо концу строки. Надеюсь это поможет...

person Steve Chambers    schedule 07.09.2012
comment
Работает как шарм! Благодарю вас! - person Epsiloncool; 07.09.2012

Код от Стива работает не во всех случаях. Например, это не работает, когда число можно найти в другом числе. ВСТАВИТЬ В tbl (col1, col2) VALUES ('60,61,64,68,73', '14,16,17,18,1'); С небольшой настройкой это может работать:

SELECT col1,
col2,
CONCAT('((\\,)', REPLACE(col2,',', '(\\,)|(\\,)'), '(\\,))') AS regex,
CONCAT(',',col1,',') REGEXP CONCAT('((\\,)', REPLACE(col2,',', '(\\,)|(\\,)'), '(\\,))') AS intersect
FROM tbl
person George    schedule 05.02.2014