MySQL Строка запроса содержит


307

Я пытался выяснить, как я могу сделать запрос с MySQL, который проверяет, $haystackсодержит ли значение (строка ) в определенном столбце определенные данные (строку $needle), например так:

mysql_query("
SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')
");

В PHP функция вызывается substr($haystack, $needle), поэтому возможно:

WHERE substr(`column`, '{$needle}')=1

Ответы:


437

На самом деле довольно просто:

mysql_query("
SELECT *
FROM `table`
WHERE `column` LIKE '%{$needle}%'
");

%Это символ для любых символов , установленных (ни один, один или много). Обратите внимание, что это может привести к замедлению работы с очень большими наборами данных, поэтому, если ваша база данных растет, вам необходимо использовать полнотекстовые индексы.


1
Это будет работать, только если вы используете подготовленный запрос. Если вы используете реальную строку (например, скрипт обновления sql liquibase), рассмотрите INSTR, упомянутый ниже). Это потому, что если ваша строка содержит%, то вы начнете сопоставлять вещи с ним.
Райан Шиллингтон

2
я знаю о похожих запросах, и все же сегодня я хотел выяснить, существует ли определенное значение в строке в каком-то столбце, я гуглял по нему .. Почему я никогда не думал об этом раньше ??
Шипящий код

1
этот регистр чувствителен?
сердитый киви

2
@angry_kiwi: с учетом column LIKE '...'регистра, с column LIKE BINARY '...'учетом регистра
Wolph

2
Я удивлен, что LIKEпредлагается проверить любую подстроку, так как этот оператор использует два символа подстановки: %и _. Это означает, что если ваша строка $ needle содержит один из этих специальных символов, тогда результаты будут совсем не такими, как ожидалось. (-1) для этого ответа и (+1) для ответа INSTR.
Skrol29

144

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

SELECT *
  FROM `table`
 WHERE INSTR(`column`, '{$needle}') > 0

Ссылка:


наверняка, как быстрее, чем INSTR?
Крис

17
@oedo: зависит. LIKE %...%не будет использовать индекс, если он есть, поэтому он должен быть эквивалентным; LIKE ...%будет использовать индекс, если присутствует. Если производительность является реальной проблемой, полнотекстовый поиск (FTS) будет лучшим подходом.
OMG Ponies

идеальный. именно то, что я искал.
Арик

2
Мне нравится это решение, так как на самом деле нет способа сортировать вещи по наличию подстроки с likeоператором. С instrтакой фразой можно заказать вот такselect * from table order by instr(col1,"mystring")
Радачина

Я хотел найти _ в поле, и это сработало. Спасибо
Безопаснее Ахмеда

53
WHERE `column` LIKE '%$needle%'

2
при поиске символа _ (подчеркивание) запрос LIKE "% _%" не работает, по какой-то причине он возвращает все строки даже без _
Войтек

1
@Wojtek _ - это подстановочный знак для любого отдельного символа, поэтому, если вы хотите найти буквенное подчеркивание, вам нужно его избежать. См. MySQL LIKE запрос с подчеркиванием .
jkmartindale

29

Мой использует LOCATEв MySQL:

LOCATE (substr, str), LOCATE (substr, str, pos)

Эта функция является многобайтовой и чувствительна к регистру, только если хотя бы один аргумент является двоичной строкой.

В твоем случае:

mysql_query("
SELECT * FROM `table`
WHERE LOCATE('{$needle}','column') > 0
");

11
'column' должно быть столбцом (без кавычек)
Войтек

10

В дополнение к ответу от @WoLpH.

При использовании LIKEключевого слова у вас также есть возможность ограничить направление совпадения строки. Например:

Если вы искали строку, которая начинается с вашего $needle:

... WHERE column LIKE '{$needle}%'

Если вы искали строку, которая заканчивается на $needle:

... WHERE column LIKE '%{$needle}'

3

знать, что это опасно:

WHERE `column` LIKE '%{$needle}%'

сделай первым:

$needle = mysql_real_escape_string($needle);

так что это предотвратит возможные атаки.


7
* Некоторые возможные атаки. Кроме того, mysql_real_escape_stringэто будет устаревшим в будущих версиях PHP.
Джек Так

11
Вы должны использовать подготовленные операторы и оставить выход в PHP. $stmt = $dbh->prepare("Where 'column' LIKE '{:needle}'"); $stmt->bindParam(':needle', $needle); $stmt->execute();
облачные работы

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.