Как мне выполнить простой SQL-поиск в одной инструкции по таблицам? - PullRequest
2 голосов
/ 11 сентября 2008

Предположим, что существуют две таблицы: users и groups.

Как обеспечить "простой поиск", при котором пользователь вводит текст, а результаты содержат как пользователей, так и группы, имена которых содержат текст?

В результате поиска должны различаться два типа.

Ответы [ 4 ]

3 голосов
/ 11 сентября 2008

Хитрость заключается в том, чтобы объединить UNION с литеральной строкой, чтобы определить тип возвращаемого объекта. В большинстве (?) Случаев UNION ALL будет более эффективным и должен использоваться, если в подзапросах не требуются дубликаты. Следующий шаблон должен быть достаточным:

 SELECT "group" type, name
   FROM groups
  WHERE name LIKE "%$text%"
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE name LIKE "%$text%"

ПРИМЕЧАНИЕ : Я добавил ответ сам, потому что вчера я столкнулся с этой проблемой, не смог найти хорошее решение и использовал этот метод. Если у кого-то есть лучший подход, пожалуйста, не стесняйтесь добавлять его.

1 голос
/ 11 сентября 2008

Я бы предложил другое дополнение

 SELECT "group" type, name
   FROM groups
  WHERE UPPER(name) LIKE UPPER("%$text%")
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE UPPER(name) LIKE UPPER("%$text%")

Вы можете сначала преобразовать $ text в верхний регистр или просто сделать это в запросе. Таким образом, вы получаете поиск без учета регистра.

1 голос
/ 11 сентября 2008

Использование LIKE вызовет ряд проблем, так как потребуется сканирование таблицы каждый раз, когда компаратор LIKE запускается с%. Это вынуждает SQL проверять каждую строку и обрабатывать ее, побайтно, через строку, которую вы используете для сравнения. Хотя это может быть хорошо при запуске, это быстро вызывает проблемы с масштабированием.

Лучший способ справиться с этим - использовать полнотекстовый поиск. Хотя это будет более сложный вариант, он даст вам лучшие результаты для очень больших баз данных. Затем вы можете использовать работающую версию примера, который Бобби Джек дал вам UNION ALL вместе с вашими двумя наборами результатов и отобразить результаты.

1 голос
/ 11 сентября 2008

Если вы используете «UNION ALL», то БД не будет пытаться удалить дубликаты - у вас не будет дубликатов между двумя запросами (так как первый столбец отличается), поэтому UNION ALL будет быстрее. * (Я предполагаю, что у вас нет дубликатов внутри каждого запроса, который вы хотите удалить)

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