2010-07-19 13 views
0

j'ai 3 tables pour stocker des informations sur les livres:Luttant avec requête MySQL à l'aide rejoint

books 
----- 
id 
title 

authors 
------- 
id 
name 

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

Lorsque les informations d'un livre est affiché, je veux alors être en mesure de choisir d'autres livres par les mêmes auteurs.

J'ai l'identifiant de livre actuel disponible dès la première requête, mais je n'arrive pas à déterminer par où commencer pour obtenir ce dont j'ai besoin car il peut y avoir plusieurs auteurs. Évidemment, avec un seul d'entre eux, ce serait simple, alors je me bats vraiment avec ça. Toute aide serait très appréciée!

Répondre

1

Je pense que cela a quelque chose à faire. Il suffit de remplacer le ? par l'ID du livre qu'ils sont en train de consulter et cela vous donnera tous les livres du même auteur.

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 = ? 
) 

Si vous voulez exclure le livre qu'ils sont en train de visualiser, vous pouvez modifier la requête comme ceci:

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
$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." 
)"; 

Je suppose que vous utilisez php. Si je me trompe, il suffit d'utiliser la chaîne de requête SQL, et d'ignorer le reste ...

0

Vous recherchez la requête ci-dessous. Je vois des solutions avec des sous-requêtes et je recommande fortement de ne pas utiliser de sous-requêtes. Ils sont plus lents que la course 2 requêtes:

  1. Avoir l'id livre vous ne SELECT author_id FROM books_to_authors WHERE book_id = '{$book_id}'
  2. Obtenez l'ID auteur puis exécutez ceci:

    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

Sauf qu'il peut y avoir plus d'un auteur pour un livre donné –

+0

Ce n'est pas un problème et requête, 'WHERE authors.id IN (" .implode (',', $ authorsIdArray). ")' et il fait le travail –