2010-04-08 6 views
201

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

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

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

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

ответ

291

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

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

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

+0

Это будет работать, только если вы используете подготовленный запрос. Если вы используете фактическую строку там (например, linquase sql upgrade script), тогда рассмотрите нижеуказанный INSTR). Это связано с тем, что если ваша строка содержит%, то вы начнете с ней сопоставлять. –

+2

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

+0

чувствителен ли этот регистр? –

34
WHERE `column` LIKE '%$needle%' 
+0

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

103

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

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

Ссылка:

+0

уверен, что LIKE быстрее, чем INSTR? – oedo

+10

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

+0

безупречный. просто то, что я искал. – arik

8

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

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

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

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

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

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

Mine использует LOCATE in mysql:

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

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

В вашем случае:

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

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

-1

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

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

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

2

быть в курсе, что это опасно:

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

сделать первый:

$needle = mysql_real_escape_string($needle); 

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

+6

* Некоторые возможные атаки. Кроме того, 'mysql_real_escape_string' будет устаревать в будущих выпусках PHP. –

+0

Полезно знать :-) –

+7

Вы должны использовать [подготовленные утверждения] (http://au1.php.net/pdo.prepared-statements) и оставить экранирование на PHP. '$ stmt = $ dbh-> prepare (« Где »столбец« LIKE »{: needle} '"); $ stmt-> bindParam (': needle', $ needle); $ stmt-> execute(); ' – cloudworks

Смежные вопросы