Есть две таблицы
Код | [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% - ненужны...
Расчитываю на советы, поправки и замечания |