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}%'
");

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

Wolph
источник
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

Ссылка:

OMG пони
источник
наверняка, как быстрее, чем 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
");
risnandar
источник
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();
облачные работы
3

Вы, вероятно, ищете find_in_setфункцию:

Where find_in_set($needle,'column') > 0

Эта функция действует как in_arrayфункция в PHP

Andres
источник