2012-04-30 64 views
1

我对表进行规范化相当陌生,而且我正在为了从3个表中获取正确的信息而带来一些麻烦。我举了一个例子,从不同的图书馆预订书籍。我有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 
"; 

,我希望能实现,如果我要列出校园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子句与在location.locID领域NULL任何记录将不被选中。

因此,我可以重新编写查询所有内连接,就像这样:

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