2016-11-06 16 views
0

私は以下を行うクエリを書こうとしています:エラーと注文を結合する

「エジンバラ」という言葉をゲストに持つ人は、予約された宿泊総数を表示します。決して予約をしていないゲストには0を含めるようにしてください。姓、名、住所、泊数を表示します。姓と名で注文する。

SELECT last_name, first_name, address, nights 
FROM booking 
RIGHT JOIN guest ON (booking.booking_id = guest.id) 
WHERE address LIKE '%Edinburgh%'; 

:ここ

ER Diagram snippet

は私の現在の(壊れた)ソリューションです:

は私がきちんと参加作品、 ERダイアグラムスニペットを作る際の問題を抱えていますそのクエリの結果は次のとおりです。

enter image description here

クエリは期待して誰かが私を助けて、作業バージョンを作成することができ、部分的に完了です。私は現在、SQLを学ぶ過程にあるので、それはむしろ基本的な、または愚かな質問です!

+0

値避けるために、COALESCEを使用することができますが、我々はあなたの宿題をしなければならないことを確認していますか? – Strawberry

答えて

1

あなたの質問はほぼ正しいと思われます。重複(一致)IDのためにいくつかの結果を出したguets idで予約IDに参加していましたが、これは外部キーに対応していない可能性が最も高いです。あなたはゲストからidに予約からguest_idに参加する必要があります。

私は(夜は整数であると仮定して)特定のゲストのためのすべての予約夜を合計するグループを追加したい:

SELECT g.last_name, g.first_name, g.address, SUM(b.nights) AS nights 
FROM guest AS g 
LEFT JOIN booking AS b ON b.guest_id = g.id 
WHERE g.address LIKE '%Edinburgh%' 
GROUP BY g.last_name, g.first_name, g.address; 

あなたが過ごした夜はnightsフィールドを使用して計算する必要があることを確認していますか?なぜそれがnullになるのですか?

  • 書き直さRIGHT JOINLEFT JOINに、それは結果には影響しません - :

    COALESCE(SUM(b.nights), 0) 
    

    注意:あなたがNULL値のためにゼロを表示したい場合は、単にそのようなCOALESCE関数とそれを包みますそれは私のためだけに清潔です。

  • エイリアスの使用。結合列
  • リファレンスを指定するときAS gは、コードが短くなり、その表の別名を持つすべての列が曖昧
+0

あなたの説明のために大きな感謝。私は今からエイリアスを使用します。 – Aidan

+0

'b.booking_id = g.id' - 本当ですか? –

+0

@PaulSpiegel私は結合ロジックを確認しませんでした。指摘してくれてありがとう。回答はそれに従って更新されました。これは問題を引き起こしているようです。 –

0
SELECT g.first_name, 
     g.last_name, 
     g.address, 
     COALESCE(Sum(b.nights), 0) 
FROM booking b 
     RIGHT JOIN guest g 
       ON (b.guest_id = g.id) 
WHERE address LIKE 'edinburgh%' 
GROUP BY g.last_name, 
      g.first_name, 
      g.address; 
+4

ここで合体を使用することが重要だと思われる理由を説明するために質問してください。また、コードを読み取り可能にするようにフォーマットしてください。 –