2012-04-30 23 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 

これは= 2 LOCIDと場所で予約図書のリストを返します。

この場合、元のクエリを保持するためにLEFT JOINがありますが、WHERE句を指定すると、location.locIDフィールドにNULLを持つレコードは選択されません。

したがって、私は再び書くことができるすべての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 
関連する問題