Как правильно построить строку поиска MySQL с помощью PHP? - PullRequest
1 голос
/ 17 декабря 2011

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

Например, в базе данных есть идентификатор, имя, адрес электронной почты, дата.

И у меня есть поле ввода для поиска на странице, которое при отправке, я хочу, чтобы оно осуществляло поиск на основе поля ввода в отношении вышеупомянутых столбцов. Лучший, каков наилучший способ / практика для этого?

Пока у меня есть следующее, но кажется, что это "тупой" поиск.

"SELECT * FROM Table WHERE id LIKE '$search%' || name LIKE '$search%' || email LIKE '$search%' || date LIKE '$search%'";

Ну, этот вид работ, но я чувствую, что должен быть лучший способ и более подходящий более умный метод.

Спасибо ...

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Нельзя заставить MySQL правильно использовать индекс, когда вы запрашиваете несколько столбцов и не используете AND (вы используете OR)

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

По вашему запросу, если вы хотите придерживаться LIKE,
тогда вам нужно построить 4 индекса по 4 столбцам,

alter table Table add index on(id);
alter table Table add index on(name);
alter table Table add index on(email);
alter table Table add index on(date);

И измените запрос на: -

SELECT * FROM Table WHERE id LIKE '$search%'
union distinct 
SELECT * FROM Table where name LIKE '$search%'
union distinct 
SELECT * FROM Table where email LIKE '$search%'
union distinct 
SELECT * FROM Table where date LIKE '$search%'

Что такое Союз?

Вне темы: -

  • вы не избежали ввода пользователя, это может привести к внедрению SQL
  • бессмысленно искать по ID, когда ввод может быть чем угодно
  • то же самое для даты
0 голосов
/ 17 декабря 2011

Я обнаружил, что задаю тот же вопрос несколько лет назад. Для нужной вам функциональности наиболее эффективным является полнотекстовый поиск. Конечно, это происходит за счет места. Я не нашел другого способа реализовать это эффективно. извините, я не знаю, поддерживается ли fts в mysql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...