2013-06-27 3 views
0

У меня есть order стола, как этотSQL запросов для объединения таблиц

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

и другой таблица

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

и

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

Я хочу, чтобы получить запись из order таблицы где id = 1 с результатом, подобным этому

id | book | author 

, что я пробовал:

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

Я не знаю, как присоединиться к этому столу, чтобы получить желаемый result.How я могу это сделать?

ответ

2

Вы можете сделать это с помощью предложения where

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

Или

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

-1 для отображения неявных объединений, которые являются Антипаттерном SQL. Мы никогда не должны научить людей использовать эту очень плохую форму SQL. – HLGEM

+0

Нужно знать все, и нужно узнать, почему один лучше другого – darijan

+0

Не следует изучать неявные объединения как новичка. У вас нет бизнеса, даже зная, что они существуют, пока вы не поймете, как присоединиться. – 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; 

Предполагая, что bookAuthorId могут быть связаны с BookID, в противном случае вам нужно добавить внешний ключ.

+0

'order' - это ключевое слово в SQL. Вам нужно избежать этого. –

+0

@DavidStarkey Исправлено, спасибо. – 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

Дэвид прав, заказ - это ключевое слово, и его следует избегать –

+0

Помимо псевдонимов, это тот же ответ, что и GrailsGuy. Только его на самом деле работали бы с тех пор, как «другой» сбежал. –