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

191

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

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

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

WHERE substr(`column`, '{$needle}')=1
Теги:
string-comparison

7 ответов

300
Лучший ответ

Довольно просто:

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

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

  • 1
    Это будет работать, только если вы используете подготовленный запрос. Если вы используете реальную строку (например, скрипт обновления sql liquibase), рассмотрите INSTR, упомянутый ниже). Это потому, что если ваша строка содержит%, то вы начнете сопоставлять вещи с ним.
  • 2
    я знаю о похожих запросах, и все же сегодня я хотел выяснить, существует ли определенное значение в строке в каком-то столбце, я гуглял по нему .. Почему я никогда не думал об этом раньше ??
Показать ещё 7 комментариев
93

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

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

Ссылка:

  • 0
    конечно, как быстрее, чем INSTR?
  • 13
    @oedo: зависит. LIKE %...% не будет использовать индекс, если он есть, поэтому он должен быть эквивалентным; LIKE ...% будет использовать индекс, если присутствует. Если производительность является реальной проблемой, полнотекстовый поиск (FTS) будет лучшим подходом.
Показать ещё 3 комментария
34
WHERE `column` LIKE '%$needle%'
  • 0
    при поиске символа _ (подчеркивание) запрос LIKE "% _%" не работает, по какой-то причине он возвращает все строки, даже без _
16

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

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

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

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

mysql_query("
SELECT * FROM `table`
WHERE LOCATE('{$needle}','column') > 0
");
  • 8
    столбец должен быть столбцом (без кавычек)
8

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

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

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

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

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

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

помните, что это опасно:

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

сделать сначала:

$needle = mysql_real_escape_string($needle);

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

  • 7
    * Некоторые возможные атаки. Кроме того, mysql_real_escape_string будет устаревшим в будущих версиях PHP.
  • 0
    хорошо знать :-)
Показать ещё 1 комментарий
-2

Вероятно, вы ищете find_in_set:

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню