Обратная функция IN - PullRequest
       1

Обратная функция IN

0 голосов
/ 21 сентября 2018

Рассмотрим следующую таблицу teammessages:

15:10 | Peter | I'm off to the store, call my mobile phone if you need me.
15:11 | Susy  | Have you seen the new scanner? It's lightning fast.
15:15 | Anne  | We have an emergency here, John broke the tap! Please switch off the water supply!
15:15 | John  | I did what?? :-D I'm in Vienna!
15:16 | Peter | I'm stuck in the elevator, help!
15:17 | Anne  | I said WATER, not POWER supply!

Когда я хочу SELECT срочные сообщения, содержащие ключевые слова, такие как "помощь" или "чрезвычайная ситуация", из этого хаотического свободного текста, я быдолжны иметь функцию «инвертировать IN», которая не проверяет, является ли поле IN заданным списком альтернатив (WHERE APPLECOLOR IN ('YELLOW', 'RED')), но которая проверяет, является ли значение данных альтернатив в поле IN (WHERE freetext REVERSE_IN ('help', 'emergency')).

Я пробовал конструкции типа WHERE freetext LIKE ('%help%' OR '%emergency%'), но это дает мне пустые результаты.

Разъяснение : я могу сделать это с freetext LIKE ... OR freetext LIKE ... OR freetext LIKE ..., но это очень долго,Поэтому я просто ищу сокращение, например IN в «обратном регистре» (APPLECOLOR = 'RED' OR APPLECOLOR = 'YELLOW' <=> APPLECOLOR IN ('RED', 'YELLOW')).

Ответы [ 6 ]

0 голосов
/ 21 сентября 2018

Возможно, вам нужна помощь words и экстренная помощь.Ты не хочешь найти

  • Джейк, твои шутки бесполезны.
  • Ты должен вычесть налог.Надеюсь, это поможет: -)

Так что проверьте, поддерживает ли ваша версия MySQL регулярные выражения, где вы можете искать слова:

select *
from teammessages
where freetext regexp '[[:<:]](help|emergency)[[:>:]]';

Демонстрация Rextester: http://rextester.com/ILROPQ12660

0 голосов
/ 21 сентября 2018

Я предлагаю Сгенерированный столбец .

Ответы, включающие LIKE, будут очень медленными здесь, а ответы, включающие выражения полнотекстового поиска (freetext), сообщают MySql для индекса каждое слово в столбце, а не просто слова, которые вам небезразличны.

Вы можете использовать сгенерированный столбец для получения простого результата Y / N или 1/0 только для слов, которые вас интересуют, и которые необходимы только для оценки полных данных столбца во время INSERT / UPDATE.

0 голосов
/ 21 сентября 2018

Вы можете найти все срочные сообщения с известными вам ключевыми словами, выполнив что-то похожее на это:

SELECT * FROM teammessages WHERE freetext LIKE '%help%' OR freetext LIKE '%emergency%';

Вы можете сделать обратное, используя NOT LIKE следующим образом:

SELECT * FROM teammessages WHERE freetext NOT LIKE '%help%' AND freetext NOT LIKE '%emergency%';
0 голосов
/ 21 сентября 2018

Вы должны попробовать:

WHERE freetext LIKE('%help%')  OR freetext LIKE('%emergency%')
0 голосов
/ 21 сентября 2018

Правильная форма вашего исходного запроса:

WHERE freetext LIKE '%help%' OR freetext LIKE '%emergency%'

Однако вы также можете рассмотреть возможность использования MATCH.Для этого вам понадобится индекс FULLTEXT для столбца message, который вы можете добавить с помощью этой команды:

ALTER TABLE teammessages ADD FULLTEXT INDEX(message);

Затем можно выполнить поиск с помощью запроса, подобного следующему:

SELECT *
FROM teammessages
WHERE MATCH(message) AGAINST('help emergency' IN BOOLEAN MODE)

, который даст вам лучшие результаты, чем LIKE, который также будет соответствовать словам типа «щенок» или «полезно» или «помогает».В вашей таблице примеров этот запрос возвращает:

time        name    message
15:15:00    Anne    We have an emergency here, John broke the tap! Please switch off the water supply!
15:16:00    Peter   I'm stuck in the elevator, help!

Этот запрос также имеет преимущество, заключающееся в том, что он не работает так же быстро, как несколько LIKE s

0 голосов
/ 21 сентября 2018

WHERE freetext LIKE ('%help%' OR '%emergency%') не работает так.

Должно быть:

WHERE freetext LIKE '%help%' OR freetext LIKE '%emergency%'

Дополнительно: С документация функции LIKE :

С LIKE вы можете использовать следующие два подстановочных знака в шаблоне:

  • % соответствует любому количеству символов, даже нулю символов.

  • _ соответствует ровно одному символу.

mysql> SELECT 'David!' LIKE 'David_';
        -> 1
mysql> SELECT 'David!' LIKE '%D%v%';
        -> 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...