Борьба с запросом MySQL с помощью объединений - PullRequest
0 голосов
/ 19 июля 2010

У меня есть 3 таблицы для хранения информации о книгах:

books
-----
id
title

authors
-------
id
name

books_to_authors
----------------
book_id
author_id

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

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

Ответы [ 3 ]

1 голос
/ 19 июля 2010

Я думаю, что это должно сделать это.Просто замените ? идентификатором книги, которую они в данный момент просматривают, и вы получите все книги одного автора.

SELECT b.*
FROM books b
INNER JOIN books_to_authors b2a ON b2a.book_id = b.id
WHERE b2a.author_id IN (
  SELECT author_id FROM books_to_authors WHERE book_id = ?
)

Если вы хотите исключить книгу, которую они в данный момент просматривают, вы можетеизмените запрос следующим образом:

SELECT b.*
FROM books b
INNER JOIN books_to_authors b2a ON b2a.book_id = b.id
WHERE b2a.author_id IN (
  SELECT author_id FROM books_to_authors WHERE book_id = ?
)
AND b.id <> ?
0 голосов
/ 19 июля 2010

Вы ищете запрос ниже.Я вижу некоторые решения с подзапросами, и я настоятельно рекомендую не использовать подзапросы.Они работают медленнее, чем 2 запроса:

  1. Имея идентификатор книги Вы делаете SELECT author_id FROM books_to_authors WHERE book_id = '{$book_id}'
  2. Получить идентификатор автора и затем выполните это:

    SELECT books.id, books.title, authors.name FROM books RIGHT JOIN books_to_authors ON books_to_authors.book_id = books.id) RIGHT JOIN authors ON (authors.id = books_to_authors.author_id) WHERE authors.id = '{$author_id}'

0 голосов
/ 19 июля 2010
$book_id = (your code for retrieving book_id);    

$db_query = "SELECT b.*
FROM books b
INNER JOIN books_to_authors bta ON bta.book_id = b.id
WHERE bta.author_id IN (
  SELECT author_id FROM books_to_authors WHERE book_id = ".$book_id."
)";

Я предположил, что вы используете php.Если я не прав, просто используйте строку запроса SQL и игнорируйте все остальное ...

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