MySQL запрос на основе 3 таблиц - PullRequest
1 голос
/ 09 августа 2009

Я работаю с PHP. У меня есть стол с именем книги. В настольных книгах у меня есть book_name с названием книги, book_publisher с идентификатором издателя и book_author с идентификатором автора. Помимо таблицы книг, у меня есть таблица books_author с именами и идентификаторами авторов и books_publisher с именами и идентификаторами издателей книг.

Я предоставляю своим пользователям 3 поля ввода, которые представляют имя автора, название книги и имя издателя, а также кнопку поиска. Они могут ввести имя автора, название книги и имя издателя в одном поиске, и мне нужно запросить в моей базе данных и вернуть имена книг, которые имеют имя автора LIKE (% ..%) введенное имя автора, название книги LIKE введенную книгу Имя и имя издателя. LIKE - введенное имя издателя.

Проблема в том, что я сохранил только идентификатор автора и идентификатор издателя в своей таблице книг, и мне нужно искать по всем трем полям и исключать дубликаты (книги, которые были сопоставлены по имени, а также по издателю).

Кто-нибудь может мне помочь построить этот запрос?

1 Ответ

6 голосов
/ 09 августа 2009

Просто присоединитесь к запросу:

SELECT *
FROM books b
JOIN book_authors ba ON b.author_id = ba.id
JOIN book_publishers bp ON b.publisher_id = bp.id
WHERE b.book_name LIKE '...'
AND ba.author_name LIKE '...'
AND bp.publisher_name LIKE '...'

Обычно в этих ситуациях поля поиска являются необязательными, поэтому вам нужно динамически составить запрос, то есть предложение WHERE позволяет фильтровать, скажем, имя издателя, если пользователь действительно ввел имя издателя.

Кроме того, поиск по LIKE '%blah%' не масштабируется за пределы тысяч или, возможно, десятков тысяч записей. Никакая индексация не может обслужить это. Возможно, вы захотите использовать что-то вроде полнотекстового поиска MySQL .

Наконец, убедитесь, что вы дезинфицируете свой ввод, то есть пропустите все поля ввода через mysql_real_escape_string().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...