Я пытался выяснить, как я могу сделать запрос с MySQL, который проверяет, содержит ли значение (строка $haystack
) в определенном столбце определенные данные (строка $needle
), например:
mysql_query("
SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')
");
В PHP функция называется substr($haystack, $needle)
, поэтому возможно:
WHERE substr(`column`, '{$needle}')=1
Довольно просто:
mysql_query("
SELECT *
FROM `table`
WHERE `column` LIKE '%{$needle}%'
");
%
является подстановочным символом для любого символа. Обратите внимание, что это может замедлить работу на очень больших наборах данных, поэтому, если ваша база данных будет расти, вам нужно будет использовать полнотекстовые индексы.
LIKE %...%
не будет использовать индекс, если он есть, поэтому он должен быть эквивалентным; LIKE ...%
будет использовать индекс, если присутствует. Если производительность является реальной проблемой, полнотекстовый поиск (FTS) будет лучшим подходом.
WHERE `column` LIKE '%$needle%'
Mine использует LOCATE
в mysql:
LOCATE (substr, str), LOCATE (substr, str, pos)
Эта функция является многобайтовой безопасностью и чувствительна к регистру, только если хотя бы один аргумент является двоичной строкой.
В вашем случае:
mysql_query("
SELECT * FROM `table`
WHERE LOCATE('{$needle}','column') > 0
");
В дополнение к ответу от @WoLpH.
При использовании ключевого слова LIKE
у вас также есть возможность ограничить, в каком направлении соответствует строка. Например:
Если вы искали строку, которая начинается с вашего $needle
:
... WHERE column LIKE '{$needle}%'
Если вы искали строку, которая заканчивается на $needle
:
... WHERE column LIKE '%{$needle}'
помните, что это опасно:
WHERE `column` LIKE '%{$needle}%'
сделать сначала:
$needle = mysql_real_escape_string($needle);
чтобы предотвратить возможные атаки.
mysql_real_escape_string
будет устаревшим в будущих версиях PHP.
Вероятно, вы ищете find_in_set
:
Where find_in_set($needle,'column') > 0
Эта функция действует как in_array
в PHP