#mysql
#mysql
Вопрос:
Я должен использовать этот формат where A operand B
. A — это поле; Я хочу, чтобы B было либо «text 1», либо «text 2», поэтому, если A содержит данные типа «text 1 texttext» или «texttext 2» , запрос будет иметь результат.
Но как мне это написать? Поддерживает ли MySQL что-то вроде
where A contains ('text 1' OR 'text 2')? `
Ответ №1:
Два варианта:
-
Используйте
LIKE
ключевое слово вместе со знаками процента в строкеselect * from table where field like '%a%' or field like '%b%'.
(примечание: Если ваша строка поиска содержит знаки процента, вам нужно их экранировать)
-
Если вы ищете более сложную комбинацию строк, чем вы указали в своем примере, вы могли бы использовать регулярные выражения (regex):
Смотрите руководство MySQL для получения дополнительной информации о том, как их использовать: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
Из них использование LIKE
является наиболее обычным решением — это стандартный SQL, который широко используется. Регулярное выражение используется реже, но гораздо мощнее.
Обратите внимание, что какой бы вариант вы ни выбрали, вам нужно знать о возможных последствиях для производительности. Поиск подобных вложенных строк будет означать, что запросу придется сканировать всю таблицу. Если у вас большая таблица, это может привести к очень медленному выполнению запроса, и никакое количество индексации не поможет.
Если это проблема для вас, и вам нужно будет искать одни и те же вещи снова и снова, вы можете предпочесть сделать что-то вроде добавления поля флага в таблицу, которое указывает, что поле string содержит соответствующие подстроки. Если вы поддерживаете это поле флага в актуальном состоянии при вставке или обновлении записи, вы можете просто запросить флаг, когда захотите выполнить поиск. Это может быть проиндексировано и сделает ваш запрос намного, намного быстрее. Стоит ли это усилий, решать вам, это будет зависеть от того, насколько плохая производительность используется LIKE
.
Комментарии:
1. Просто будьте осторожны при использовании инструкции ‘or’. Лучше всего использовать круглые скобки вокруг них, такие как
select * from table where (field like '%a%' or field like '%b%')
. Если у вас есть другиеAND
предложения, ваш запрос может действовать какSELECT * FROM TABLE WHERE (A = 1 AND B =2 AND C = 3) OR (D =4)
, что обычно не то, что вы хотите.2. Со своей стороны, в свете использования в вопросе A и B, было бы немного понятнее, если бы вы сказали %text 1% вместо %a%
Ответ №2:
Вы можете написать свой запрос следующим образом:
SELECT * FROM MyTable WHERE (A LIKE '%text1%' OR A LIKE '%text2%')
%
Это подстановочный знак, означающий, что он выполняет поиск по всем строкам, где столбец A содержит либо text1, либо text2
Комментарии:
1. но я должен использовать формат
A operand B
. На самом деле это все 3 переменные, которые я должен использовать из-за программирования2. Я, честно говоря, не уверен, что это возможно в рамках ваших ограничений… когда мы сравниваем для двух совершенно разных шаблонов, мы должны сравнивать для них отдельно, и существует логическое значение OR, чтобы мы могли это сделать. Я не знаю ни о каком сравнении MySQL, которое позволяло бы нам проводить сравнение по любому из двух шаблонов только с одним оператором.
Ответ №3:
Я использовал в большинстве случаев опцию LIKE, и она работает просто отлично. Я просто хотел бы поделиться одним из моих последних опытов, когда я использовал функцию INSTR. Независимо от причин, которые заставили меня рассмотреть эти варианты, здесь важно то, что использование аналогично: instr(A, ‘text 1’) > 0 или instr (A, ‘text 2’) > 0 Другим вариантом может быть: (instr (A, ‘text 1’) instr(A, ‘text 2’)) > 0
Я бы выбрал опцию ‘%text1%’ ИЛИ ‘%text2%’ … если нет, надеюсь, что этот другой вариант поможет
Ответ №4:
Я пользователь для поиска размера мотоцикла :
Например: Data = «Размер цикла шины 70 / 90 — 16 «
я могу выполнить поиск с помощью «70 90 16»
$searchTerms = preg_split("/[s,-/?!] /", $itemName);
foreach ($searchTerms as $term) {
$term = trim($term);
if (!empty($term)) {
$searchTermBits[] = "name LIKE '%$term%'";
}
}
$query = "SELECT * FROM item WHERE " .implode(' AND ', $searchTermBits);
Комментарии:
1. Я думаю, что это должно быть
OR