Поиск строки в текстовом столбце в MySQL

У меня есть таблица mysql, в которой есть столбец, в котором xml хранится в виде строки. Мне нужно найти все кортежи, в которых столбец xml содержит заданную строку из 6 символов. Ничто другое не имеет значения - все, что мне нужно знать, это есть ли эта 6-символьная строка или нет.

Так что, вероятно, не имеет значения, что текст отформатирован как xml.

Вопрос: как я могу искать в mysql? т.е. SELECT * FROM items WHERE items.xml [contains the text '123456']

Есть ли способ, которым я могу использовать оператор LIKE для этого?


person user94154    schedule 26.03.2010    source источник
comment
См. это: winashwin.wordpress.com/2012/08/28/mysql- поиск   -  person    schedule 30.08.2012


Ответы (6)


Вероятно, вы могли бы использовать LIKE предложение для выполнения некоторое простое сопоставление строк:

SELECT * FROM items WHERE items.xml LIKE '%123456%'

Если вам нужна более продвинутая функциональность, взгляните на функции полнотекстового поиска MySQL здесь: http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

person Mike Cialowicz    schedule 26.03.2010
comment
.. как мне изменить это для использования с PHP-запросом? У меня есть строка $message, и я хочу выбрать строку именно с этой строкой. У меня есть SELECT * FROM Messages WHERE from_id = '$fromID' AND to_id = '$toID' AND message LIKE '$message', но я не думаю, что это работает - person Hristo; 30.06.2010
comment
Что, если 123456 является началом строки, тогда это не сработает. - person tmarois; 11.10.2018
comment
timothymarois — % соответствует нулю или более символам, поэтому он будет работать, если нужная строка находится в начале, конце или середине того, что вы ищете. См.: w3schools.com/sql/sql_like.asp - person LConrad; 20.12.2018
comment
Вероятно, вам также следует избежать его. - person c00000fd; 25.12.2019

Использование лайка может занять больше времени, поэтому используйте full_text_search:

SELECT * FROM items WHERE MATCH(items.xml) AGAINST ('your_search_word')
person Raj    schedule 20.10.2011
comment
Доказано, что это быстрее, чем LIKE ? - person Tim Baas; 03.04.2013
comment
Важно отметить, что для этого необходимо иметь индекс FULLTEXT в целевом столбце. - person stamster; 03.12.2018
comment
Чтобы еще больше расширить для других, FTS очень сильно отличается от LIKE, который будет возвращать варианты слов и фраз, а FTS - нет. например. LIKE '%123456%' вернет результаты с "0123456", "123456", "1234567" и т. д. Где AGAINST('123456') вернет результаты только в виде отдельных слов для сопоставления, таких как "is 123456", "123456", "123456 is" и т. д., но НЕ найдет "0123456" или "1234567". Пример: db-fiddle.com/f/5rJUTdDtV63RybnY4U9L2W/0. Вот почему FTS может работать быстрее с большими наборами данных, так как не выполняет полное сканирование таблицы, которое происходит с LIKE. - person Will B.; 31.03.2020

SELECT * FROM items WHERE `items.xml` LIKE '%123456%'

Оператор % в LIKE означает "здесь может быть что угодно".

person Amy B    schedule 26.03.2010

Почему бы не использовать НРАВИТСЯ?

SELECT * FROM items WHERE items.xml LIKE '%123456%'
person systempuntoout    schedule 26.03.2010

ты имеешь в виду:

SELECT * FROM items WHERE items.xml LIKE '%123456%'
person rytis    schedule 26.03.2010

Когда вы используете строку подготовки WordPress, приведенные выше решения не работают. Это решение, которое я использовал:

   $Table_Name    = $wpdb->prefix.'tablename';
   $SearchField = '%'. $YourVariable . '%';   
   $sql_query     = $wpdb->prepare("SELECT * FROM $Table_Name WHERE ColumnName LIKE %s", $SearchField) ;
 $rows = $wpdb->get_results($sql_query, ARRAY_A);
person Debbie Kurth    schedule 22.03.2019