2012-04-30 4 views
1

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

//SQL query: 
$sql = 
"SELECT * FROM books 
JOIN (location LEFT JOIN reservations ON location.locID = reservations.locID) 
ON books.bookID = location.bookID 
WHERE location.locID=2 
"; 

и выходное я надеялся достичь, если бы я был перечислить книги в Campus B:

title |locName |status 
Book 1|Campus B|1 
Book 2|Campus B|0 
Book 3|Campus B|0 
Book 4|Campus B|0 
Book 5|Campus B|1 

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

table: books 
bookID|title 
    1 | Book 1 
    2 | Book 2 
    3 | Book 3 
    4 | Book 4 
    5 | Book 5 


table: location 
locID|locName 
    1 | campus A 
    2 | campus B 
    3 | campus C 


table: reservations 
bookID|locID|status 
    1 | 1 | 1 
    3 | 1 | 1 
    4 | 1 | 1 
    1 | 2 | 1 
    5 | 2 | 1 
    4 | 3 | 1 
    5 | 3 | 1 

ответ

3

Я думаю, что это больше в соответствии с тем, что вы ищете:

SELECT * 
FROM books b 
LEFT JOIN reservations r ON b.bookID = r.bookID 
JOIN location l on r.locID = l.locID 
WHERE l.locID = 2 

Это возвращает список книг, зарезервированных на месте с locID = 2.

В этом случае у меня есть LEFT JOIN, чтобы сохранить исходный запрос, однако с учетом предложения WHERE любые записи с NULL в поле location.locID не будут выбраны.

Поэтому я мог бы переписать запрос со всеми INNER присоединяется, например, так:

SELECT * 
FROM books b 
JOIN reservations r ON b.bookID = r.bookID 
JOIN location l on r.locID = l.locID 
WHERE l.locID = 2 

Другие запросы, которые могут быть интересны:

Получить все книги, независимо от того, является ли они или нет резервируются в любом месте:

SELECT * 
FROM books b 
LEFT JOIN reservations r ON b.bookID = r.bookID 
JOIN location l on r.locID = l.locID 

Получить все места, независимо от того, есть или нет книги защищены там:

SELECT * 
FROM books b 
JOIN reservations r ON b.bookID = r.bookID 
RIGHT JOIN location l on r.locID = l.locID 

Получить все книги и все локации:

SELECT * 
FROM books b 
LEFT JOIN reservations r ON b.bookID = r.bookID 
RIGHT JOIN location l on r.locID = l.locID 
+0

Оу .. Я вижу. Хорошо, это действительно полезно! спасибо – Skyros

0
SELECT 
books.title 
, location.locName 
, IFNULL(reservations.status, 0) status 
FROM 
books 
JOIN location 
LEFT JOIN reservations ON (
    location.locID = reservations.locID 
    AND books.bookID = location.bookID 
) 
WHERE location.locID = 2 
Смежные вопросы