Как написать запрос MySQL, где A содержит («a» или «b»)

#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:

Два варианта:

  1. Используйте LIKE ключевое слово вместе со знаками процента в строке

     select * from table where field like '%a%' or field like '%b%'.
      

    (примечание: Если ваша строка поиска содержит знаки процента, вам нужно их экранировать)

  2. Если вы ищете более сложную комбинацию строк, чем вы указали в своем примере, вы могли бы использовать регулярные выражения (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