MySQL поиск по двум связным таблицам

Имеется три таблицы:

1. a_books

a_books

2. a_books_authors

a_books_authors

3. a_authors

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 шт):

Автор решения: Mike
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 с маской начинающейся на %. Так что в этом запросе все равно будет полное сканирование таблиц книг и авторов. И оптимизировать поиск в таком случае возможно только с использованием полнотекстового поиска и соответствующих индексов.

→ Ссылка