mysql find_in_set строка, начинающаяся с - PullRequest
0 голосов
/ 24 августа 2018

Мне нужно искать значение, начиная с заданной строки в значениях, разделенных запятыми.
Пример,
У меня есть '1_2_3_4_5_6, 1_2_3_4_5_8, 1_2_3_6_5_8' в моей колонке.Я могу искать строки с точным значением, используя
select * from table where find_in_set('1_2_3_4_5_6',column)

Но как искать, если задана начальная часть строки?как то так:
select * from table where find_in_set('1_2_3%',column)?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

вы можете попробовать с 'REGEXP'

Если вы хотите сопоставить данные с подстрокой, попробуйте это

SELECT * FROM `table` WHERE `column` REGEXP '[, ]?1_2_3[^,]*,?' ;

или

Если вы хотите точный стартматч, пожалуйста, попробуйте это

SELECT * FROM `table` WHERE `column` REGEXP '[, ]?1_2_3[^,]*,?' AND `column` NOT REGEXP '[^, ]1_2_3[^,]*,?' ;
0 голосов
/ 26 августа 2018

Я смог решить это без регулярных выражений.Ответ Сонама также верен.

SELECT * from table WHERE CONCAT(',', columnname, ',') like '%,1_2_3%'
0 голосов
/ 24 августа 2018

Если я вас правильно понимаю (я все еще не уверен, что понимаю), вы можете просто использовать:

SELECT * FROM table WHERE column LIKE '%1_2_3%';

Это даст вам столбцы, в которых значение равно:

1_2_3_4_5_5
1_4_5_, 1_2_3_4_5_, 6_7

и т. Д.

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

В соответствии с предложениями @Xatenev, если вам действительно нравятся только значения и строки каждой подходящей строки, это не сработает так хорошо и будет очень затратно. Вот шаги, которые я бы выполнил:

  1. Разделить все столбцы CSV на несколько строк (это взлом и убийца производительности, я нашел какое-то рабочее решение, но не тестировал его, см. здесь ): псевдокод: SELECT ID, SPLIT(',', column) AS entries FROM table (НЕ РАБОТАЕТ )
  2. Отфильтруйте новую виртуальную таблицу, чтобы выбрать только строки, соответствующие префиксу (SELECT * FROM virtual_table WHERE find_in_set("1_2_3%, entries) ORDER BY ID)
  3. Объединить соответствующие entries обратно в список для каждого ID. например SELECT ID, GROUP_CONCAT(entries SEPARATOR ', ') FROM filtered_table GROUP BY ID
  4. Сделай что-нибудь

Неизвестная часть - начало с разделения на несколько строк. Существует множество возможных решений со своими недостатками или преимуществами. Имейте в виду, что это всегда (независимо от выбранного метода) будет стоить много производительности.

ДОПОЛНИТЕЛЬНОЕ УЗЕЛ:

В вашей ситуации могут быть приключения, когда каждая строка соответствует вашей строке поиска, как в моем первом примере, и фильтруется в памяти. Это может быть быстрее, чем в MYSQL.

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