Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Поиск по базе


Автор: patap 13.8.2010, 09:50
Есть две таблицы

Код

[records]
 -  id
 -  name
 -  info

[note]
 -  note_id
 -  note_record_id
 -  note_text


Нужно сделать поиск в этих таблицах, по полям

Код

records.name
records.info
note.note_text


Сделал следующим образом
Код

SELECT DISTINCT records.id, records.name, records.info, note.note_text 
FROM records LEFT JOIN note ON 
  (records.id = note.note_record_id AND 
   note_id IN (SELECT note_id FROM note WHERE note_text LIKE '%$search%') -- это условие для того, чтобы приджойнить к records только те заметки, в которых есть ключевая строка
                                                                          -- это для того, чтобы в результат включить значения note_text, т.к. сделать UNION с records, в условии ниже, 
                                                                          -- по полю note_text невозможно
  )
WHERE id IN -- 
  (SELECT id FROM records WHERE name LIKE '%$search%' OR info LIKE '%$search%' 
   UNION SELECT note_record_id FROM note WHERE note_text LIKE '%$search%') -- если делать без UNION с note, то если в records.name или records.info не будет 
                                                                           -- совпадений - вернется пустой результат. А нужно учесть те записи, в которых нет 
                                                                           -- совпадений по records.name или records.info, но есть совпадения в связнаных с ними заментками из таблицы note
ORDER BY records.id


запрос выполняет то, что нужно. Но у меня есть сомнения по поводу оптимальности (т.к. в этой области я не очень)
Также вопрос на счет индексов - нужны ли они здесь? Я так понимаю что при такой маске как %$search% - ненужны...

Расчитываю на советы, поправки и замечания

Автор: skyboy 13.8.2010, 10:43
Цитата(patap @  13.8.2010,  08:50 Найти цитируемый пост)
Но у меня есть сомнения по поводу оптимальности (т.к. в этой области я не очень)

раз на view http://bugs.mysql.com/bug.php?id=10231 сделать fulltext index, также http://stackoverflow.com/questions/1117005/mysql-full-text-search-across-multiple-tables сделать один fulltext index на поля разных таблиц, то тебе либо нужен внешний индексатор(рекомендую http://sphinxsearch.com), либо придется искать в каждой таблице отдельно по fulltext индексу и объединять результаты поиска.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)