2016-05-23 7 views
0

私はいくつかの異なるテーブルを持っています.1つはhotelであり、チェーンチェーンに関する情報が含まれており、もう1つはroomです。情報がある列にnullを返すクエリ

私はホテル名のリストと部屋番号を特定の方法で注文したデータベースを照会しようとしています。それらを注文するのは簡単ですが、私はこの作業をするためにいくつかのコードをハックしようとするのに苦労しました。

私は何を持っていることは次のとおりです。

SELECT 
    hotelName, 
    roomNo 
FROM 
    hotel 
RIGHT JOIN 
    room 
ON 
    hotel.hotelName = room.roomNo 

これは動作しますが、それは、テーブルを結合して、すべての部屋番号を提示したが、すべてのホテル名がヌルとして返されます。私は数日間、これを研究していますが、私はそれをどのように機能させるかを考え出すことができません。テーブルは、とキーを介して接続されていませんが、私はそれが問題ではないと伝えることができる限り、それは通常のLEFT JOINとは関係ありませんでした。この1男上の任意の助けを

乾杯:)

これはphpMyAdminの上のデザイナーと私は、現在のコードを取得していた結果で提示するデータベースです。私が必要とする唯一の違いは、ホテル名がデータベースに格納されている実際のホテル名を示していることです。

enter image description here

+0

あなたはホテルに属していない部屋がありますか? –

+0

なぜあなたは右に参加しますか?なぜここにそれが必要なのか分かりません。 (そして、ほとんどの人は左結合を好んでいるので、「メインテーブルはオプションのデータを結合したままにしておきます」と理解しやすくなります) – jarlh

+0

部屋をホテルに関連付ける 'room'テーブルの外部キーは何ですか?意味的に、 'hotelName'と' roomNo'は関連するべきではありません。 – Jodrell

答えて

1

あなたはホテル、ホテル名、部屋番号を経由して部屋をリンクされている、私はそれがあるべきだと思う:あなたはHOTEL-持つことができる場合

SELECT 
    hotelName, 
    roomNo 

FROM 
    hotel 

INNER JOIN 
    room 

ON 
    hotel.HotelNo = room.HotelNo 

right joinは理にかなっていますホテルに属さない部屋はINNER JOINです。

あなたのホテルの名前はいいプライマリキーではありません。代わりにHotelIDを定義する必要があります。ホテル名と部屋番号は全く異なる2つのようです。 更新:あなたのデシベルの新しいイメージは、それは私はあなたがあなたの部屋のテーブルにホテルに外部キー列を追加するのを忘れていると思いますHotelNo

だということを示しています。同じ名前のホテルが複数ある可能性があるので、HotelNameは悪い候補です。一意の識別子が必要です。 hotel(f.e. HotelID)にプライマリキー列を作成し、room(ホテルが所属するホテル)にFK列を作成します。この列の名前をHotelIDとすることもできます。

あなたが使用する必要があります
+0

これは "on clause"の中の "unknown.htm" room.hotelNameを返す " – Slappy

+0

当然、私は多くの場合、物事をより綺麗にするためにホテルに適切なIDを持っているだろうが、これはちょうど評価が求めた正確な方法にレイアウトされている。私の理解から、RIGHT JOINは実際のシナリオではほとんど使用されていません。 – Slappy

+0

@ Slipy:それは間違っていることを示すだけで、私はあなたのdbスキーマを知らない。あなたは 'roomNo'と' hotelName'で両方のテーブルをリンクしていましたが、意味がありますか?ホテル名と部屋番号は全く異なる2つのようです。私はあなたの部屋のテーブルにホテルに外国のキー列を追加するのを忘れてしまったと思います。同じ名前の複数のホテルが可能なので、ホテル名は悪い候補です。一意の識別子が必要です。 'hotel'(プライベート・ホテルID')にプライマリ・キー列を、' room'(客室が属するホテル)にFK列を作成します。この列にも「HotelID」と名前を付けることができます。 –

0

内部にはテーブルが子テーブルにユニーク外部キー(例えばhotelID)を介して接続されていない場合は、あなたが言うことができる方法はありません参加

SELECT 
    hotelName, 
    roomNo 
FROM hotel 
INNER JOIN room ON hotel.YourHotelID=room.YourHotelID; 
0

のために参加し、適切なconditioお部屋は特定のホテルに属しています

+0

外来キーは便利ですが、決して必要はありません。 – jarlh

+0

子テーブルの親テーブルから一意の参照を安全にする必要があります。実際の参照なしにそのプレーンを行うことはできますが、それは非常に悪い習慣になります。 – mimzee

関連する問題