2013-06-27 4 views
0

J'ai une table order comme celui-cirequête SQL pour joindre des tables

id | bookId | bookAuthorId 
-------------------------- 
1  3   2  
2  2   1   
3  1   2   

et une autre table

bookId | book 
--------------- 
    1  bookA 
    2  bookB 
    3  bookC 

et

bookAuthorId | author 
------------------------ 
    1    authorA 
    2    authorB 

Je veux enregistrer à partir order table où id = 1 avec un résultat comme ceci

id | book | author 

ce que j'ai essayé:

select * from order 
join bookId,bookAuthorId 
    on order.bookId = books.bookId 
     and order.authorId = authors.authorId 

Je ne sais pas comment joindre ces table pour obtenir le result.How désiré puis-je faire cela?

Répondre

2

Vous pouvez le faire en utilisant la clause where

select 
    id, book, author 
from 
    `order`, book, author 
where 
    `order`.bookId = book.bookId 
    and 
    `order`.authorId = author.authorId 

Ou

select 
    o.id, b.book, a.author 
from 
    `order` o 
natural join 
    book b 
natural join 
    author a 
+0

-1 pour montrer les jointures implicites qui sont un antipattern SQL. Nous ne devrions jamais apprendre aux gens à utiliser cette très mauvaise forme de SQL. – HLGEM

+0

On devrait tout savoir, et on devrait savoir pourquoi on est meilleur qu'un autre – darijan

+0

On ne devrait pas apprendre les jointures implicites en tant que débutant. Vous n'avez pas d'affaire même en sachant qu'ils existent jusqu'à ce que vous compreniez les jointures. – HLGEM

2
select `order`.id, book.book, author.author 
from `order` 
join book on (`order`.bookId = book.bookId) 
join author on (author.bookAuthorId = book.bookId) 
where `order`.id = 1; 

En supposant que bookAuthorId peut être lié à BookID, sinon vous aurez besoin d'ajouter un clé étrangère.

+0

'order' est un mot-clé dans SQL. Vous devez y échapper. –

+0

@DavidStarkey Correction, merci. – Igor

3
select o.id, b.book, a.author 
from 'order' o 
join book b on o.bookid=b.bookid 
join author a on o.bookauthorid=a.bookauthorid 
where o.id=1 
+1

David a raison, l'ordre est un mot-clé et devrait être échappé –

+0

À part les alias, il s'agit de la même réponse que GrailsGuy. Seul le sien fonctionnerait réellement puisque 'other' est échappé. –