MySQL поиск по двум связным таблицам
Имеется три таблицы:
1. a_books
2. a_books_authors
3. a_authors
Требуется осуществить поиск по таблицам, чтобы запросом можна было найти как книгу, так и автора.
Написал следующий запрос:
SELECT
a_books.book_title,
GROUP_CONCAT(a_authors.author_name) AS author_name
FROM
a_books
INNER JOIN a_books_authors ON a_books.book_id = a_books_authors.book_id
INNER JOIN a_authors ON a_books_authors.author_id = a_authors.author_id
WHERE
a_books.book_title LIKE '%book%'
OR a_authors.author_name LIKE '%book%'
GROUP BY
a_books.book_title
Который прекрасно работает если искать книгу:
Но если вместо LIKE '%book%', ввести %author 1%, то выведет только одного автора книги, а конкретно Author 1, в то же время мне нужно получить всех авторов, как в первом запросе...
Далее я написал следующий запрос, который работает как нужно:
SELECT
a_books.book_title,
GROUP_CONCAT(a_authors.author_name) AS author_name
FROM
a_books
INNER JOIN a_books_authors ON a_books.book_id = a_books_authors.book_id
INNER JOIN a_authors ON a_books_authors.author_id = a_authors.author_id
GROUP BY
a_books.book_id
HAVING
author_name LIKE '%author 1%'
OR a_books.book_title LIKE '%author 1%'
Вопрос: Является ли данный вариант единственно возможным, и верным? И является ли он вообще верным? Насколько я знаю при использовании HAVING, нет возможности использовать индексы, в отличии от WHERE LIKE 'query%'. Есть ли аналог решения задачи? Или оставить как есть? Спасибо!
Ответы (1 шт):
SELECT
a_books.book_title,
GROUP_CONCAT(a_authors.author_name) AS author_name
FROM
a_books
INNER JOIN a_books_authors ON a_books.book_id = a_books_authors.book_id
INNER JOIN a_authors ON a_books_authors.author_id = a_authors.author_id
WHERE
a_books.book_title LIKE '%book%'
OR a_books.id in(
select book_id
from a_authors a, a_books_authors b
where a.author_name LIKE '%book%' and b.author_id=a.author_id
)
GROUP BY
a_books.book_title
Что касается использования индексов, об этом можете не волноваться, они очень редко используются при наличии в запросах OR и в принципе не могут быть использованы при использовании LIKE с маской начинающейся на %. Так что в этом запросе все равно будет полное сканирование таблиц книг и авторов. И оптимизировать поиск в таком случае возможно только с использованием полнотекстового поиска и соответствующих индексов.




