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
4

2 に答える 2

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が含まれるレコードは選択されません。

したがって、次のように、すべての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
于 2012-04-30T16:37:03.030 に答える
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
于 2012-04-30T16:49:10.017 に答える