2017-01-08 15 views
4

私は、SQLとその関連について少し混乱しています。 私は2つのテーブルを持っています"ホテル""部屋"。私部屋テーブルで基本的なSQL SUMとJOIN

は、私がと「本」「容量」「hotel_id」、というフィールドを持っている と私のホテル表には、私がフィールド「名前」を持っています。

マイ「本」フィールドはブールあるので、それは、「0」だ場合、それが予約されそれは自由であることを意味し、そしてそれは「1」である場合。

私の主な目標は、このように、自由な部屋に基づくホテルの名前と空き容量を表示することです:

コスタ・デル・ソル

容量

(2つの列を持つテーブルであることを意味する)

だから私はで始まるためにこれを書いた:

SELECT * FROM room WHERE book = "0"; 

私にすべて無料の部屋を与えます。

は、その後、私はこれを書いた:私は自分のIDの

を持つすべてのホテルのすべての容量を提供します。そして、私が書いた

SELECT hotel_id, SUM(capacity) FROM room WHERE book = "0" GROUP BY hotel_id; 

:私のホテルの名前とを与える

SELECT name, hotel_id FROM hotel INNER JOIN room ON hotel.id = room.hotel_id GROUP BY name; 

そのIDの。

の合計との合計をにすることで少し失われています。私はそれを動作させる方法を理解できませんでした。

私はこれを試してみましたが、働いていない:

SELECT name, hotel_id, sum(capacity) AS hotelcapacity FROM hotel 
INNER JOIN room ON hotel.id = room.hotel_id GROUP BY hotelcapacity; 

誰も私を助けることができれば、それははるかに高く評価されるだろう。ありがとうございました。

+1

互換性のないデータベースタグを削除しました。実際に使用しているデータベースにタグを付けてください。 –

+0

申し訳ありませんが、私はそれがサーバー側にあると思っていましたが、スパムを意味しませんでした。 –

答えて

2

なぜあなたは代わりのようなidとnameのホテル能力のグループになります。

SELECT h.name, r.hotel_id, sum(r.capacity) AS hotelcapacity 
FROM hotel h INNER JOIN room r 
ON h.id = r.hotel_id 
GROUP BY h.name, r.hotel_id 

が空き部屋の容量を取得するには、以下のようなクエリを使用します。

SELECT h.name, r.hotel_id, sum(r.capacity) AS hotelcapacity 
FROM hotel h INNER JOIN room r 
ON h.id = r.hotel_id 
WHERE r.book = "0" 
GROUP BY h.name, r.hotel_id 
+0

あなたの助けていただきありがとうございますが、私はこのエラーが発生します。 ** ERROR 1052(23000):フィールドリストの 'capacity'列があいまいです** –

+0

おそらくあなたはホテルと部屋の両方のテーブルに容量を持っています。上記のようにエイリアスを使用します。 – SMA

+0

それは動作します! :)しかし、何を意味する**ホテルh **と**部屋r **なぜ** h **と** r **は一人ですか? また、それはコールバックなしで動作します** hotelcapacity **。何故ですか? ** hotelcapacity **は役に立たないのですか? –

2

をあなたがグループに必要ホテルの名前ではなく、容量。また、ホテルIDをクエリから除外することもできます。

ような何か:

SELECT name, SUM(capacity) AS hotelcapacity 
FROM hotel 
INNER JOIN room ON hotel.id = room.hotel_id 
GROUP BY name; 

クエリでホテルのIDが必要な場合は、あなたがそうすることで、グループに追加してください:

SELECT name, hotel_id, SUM(capacity) AS hotelcapacity 
FROM hotel 
INNER JOIN room ON hotel.id = room.hotel_id 
GROUP BY name, hotel_id; 
1

最終的なクエリがによって集約する必要があるに右の列:

SELECT h.name, r.hotel_id, sum(r.capacity) AS hotelcapacity 
FROM hotel h LEFT JOIN 
    room r 
    ON h.id = r.hotel_id 
    WHERE r.book = "0" 
GROUP BY h.name, r.hotel_id; 

私も、私はちょうど、参加左にJOINを変更一部のホテルにはroomの客室がありません。

また、テーブルエイリアスも導入しました。あなたはこれらの使用の習慣に入るべきです。テーブル名の略語が最適です。また、列を参照するときには(コードを明確にし、コンパイラーのエラーを防ぐために)表の別名を使用する必要があります。

+0

助けていただきありがとうございますが、このエラーが表示されます:**エラー1054(42S22): 'フィールドリスト'の 'h.hotel_id'列が不明** –

+0

解決策は正常に動作します:) ** h.hotel_id * * to ** r.hotel_id **は私の部屋のテーブルにあったからです。私はあなたの答えをより良いものとして検証します。なぜなら、それはもっとシンプルに見えますが、なぜあなたは**ホテルh *と**部屋r **をプットしたのですか?それは何のために立つのですか?なぜ** h **と** r **は単独であるのですか? –