Хранимая процедура MySQL: поиск переменного числа строк - PullRequest
4 голосов
/ 12 июля 2010

Мне нужна некоторая хранимая процедура, которая называется:

search('foo bar')

делает поиск похожим на:

SELECT FROM A, B
WHERE A.B_ID = B.ID
AND (A.f1 LIKE '%foo%' OR A.f2 LIKE '%foo%' OR B.f3 LIKE '%foo%')
AND (A.f1 LIKE '%bar%' OR A.f2 LIKE '%bar%' OR B.f3 LIKE '%bar%')

И у меня есть некоторые сомнения и вопросы:

  1. Я не могу передать массив процедуре, поэтому мой единственный вариант - передать строку напрямую, как в примере ('foo bar')?

  2. Так что я предполагаю, что мне нужно разделить код SP.Я не знал как, поэтому я искал и нашел это решение .Использует временные таблицы и что я думаю много неуклюжего кода.Неужели так сложно?Как насчет производительности?

  3. Я не знаю, как создать такой динамический запрос.Я предполагаю, что мне нужно перебрать токены, чтобы создать новый блок предложения WHERE для всех, но я не уверен, как это сделать, или это лучшее решение.Может быть, лучше объединить строки, а затем сделать подготовленный оператор?

Спасибо.

Примечание: я использую iBATIS (Java) для вызова этой подпрограммы.

1 Ответ

3 голосов
/ 12 июля 2010

Вам нужно использовать полнотекстовый поиск (FTS) - есть встроенная функциональность MySQL для FTS, которую можно использовать только для таблиц MyISAM, и сторонние FTS, такие как Sphinx, на выбор.Вот интерактивное слайд-шоу, представляющее приличное введение и инструкции .

При использовании MySQL FTS ваш запрос будет выглядеть следующим образом:

SELECT *
  FROM A AS a
  JOIN B AS b ON b.id = a.b_id
 WHERE MATCH (a.f1, a.f2, b.f3) AGAINST ('foo bar');

Динамический SQL все еще возможен, в зависимостио том, насколько сильно вы хотите / нужно сделать запрос.Я хотел бы изучить предложения FTS, прежде чем рассматривать динамический SQL ...

...