Задать вопрос
@hippocrates_ho_koios
врач-кибернетик

MySQL: как реализаовать поиска по нескольким вхождениям?

Добрый день. Как лучше реализовать поиск по нескольким вхождениям в связке PHP (PDO) + MySQL? Сейчас использую вариант
SELECT * FROM articles WHERE name LIKE "%опух%" AND name LIKE "%поч%"

для того, чтобы в поиск попали и статья "Диагностика опухолей почек" и "Лечение почечных злокачественных опухолей". Но тут возникает проблема в формировании prepared statements в PHP (PDO). Есть ли лучшее решение? Спасибо.
  • Вопрос задан
  • 136 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Но тут возникает проблема в формировании prepared statements в PHP (PDO).
А в чем проблема?
$sql = 'SELECT * 
FROM articles 
WHERE name LIKE ? 
AND name LIKE ?';
$prep = $dbh->prepare($sql);
$ret = $prep->execute(['%' . 'опух' . '%', '%' . 'поч' . '%']);
Ответ написан
@rPman
Есть еще instr это однозначно быстрее like

Ну и fulltext индексы конечно, искать с некоторым языком запросов

p.s. если искать в строках базы приходится ограниченное количество слов (т.е. грубо говоря список слов определяется проектом, а не свободным вводом от пользователя) то можно заранее (при добавлении строк) построить свой собственный индекс, размещая факт наличия подстроки в строке boolean полем true/false или создав соответствующие таблицы (если наличие слов сильно разряжено - это эффективнее), где наличие записи - факт наличия слова.

Например у тебя искать нужно три слова: man, woman, child, соответственно создаешь три boolean колонки has_man, has_woman, has_child в той же таблице где анализируемая строка и заполняешь их триггером.

Или если тот же пример но через таблицы, то в искомой таблице у тебя должно быть primary key поле, и ты создаешь на каждое слово по таблице has_man, has_woman, has_child, с единственным полем id, в эти таблицы помещаешь запись с id из искомой таблицы, если в ее строке есть это слово.. это так же можно делать триггером.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы