2017-09-06 10 views
1

私はフライトテーブルと予約テーブルを持っています。MySQL - 関係が存在する場所を追加する、存在しない場合は無視する

フライトが列を持っている、max_passengers

航空券の予約がflight_id

を参照の予約テーブルのように、私はlaravel/PHPでこれを使用していますが、そのために、私は実際のSQLのヘルプを探しています持っています私は現在、飛行を照会し、max_passengersからこの番号をsumtractingが、どのように私はないSQLを書くことができ、その後sum(bookings.places_booked)を使用することにより、左空き場所の数をうまくすることができますビット愚か私を運転:

  • はランダムの予約はこのフライト和に対して計上場所の量であり、どこ< max_passengers

を追加した場合、私はこの部分を行うことができますが、何の予約はに対して行われていないので、もしどのようにあなたがそれを作ることができ、飛行

  • を選択しますjoin/whereはオプションで、max_passengersが空き領域の数になるため、問題にはなりません。

    フライトテーブルにfree_placesの列を追加することを考えましたが、現在の設定で回避される問題が発生します。

    SELECT flights.*, bookings.* 
    FROM flights 
    LEFT JOIN bookings ON flights.id = bookings.flight_id 
    WHERE sum(bookings.places_booked) < flights.max_passengers 
    GROUP BY flights.id 
    ORDER BY flights.id ASC 
    

    この

    は私がachiveしようとしているものですが、私が言ったように私が作る方法を知らない参加/どこオプショナルので何の関係が存在しないところ、それはチェックについては重要ではありません。

    EDIT(最終SQL):

    SELECT flights.*, bookings.* 
    FROM flights 
    LEFT JOIN bookings ON flights.id = bookings.flight_id 
    GROUP BY flights.id 
    HAVING COALESCE(sum(bookings.places_booked),0) < flights.max_passengers 
    ORDER BY RAND() 
    LIMIT 1 
    
  • 答えて

    2

    2つのこと:
    1)あなたはHAVING句ではなく集約機能のためのWHERE句を(クエリがエラーをスローする必要があります)を使用する必要があります。

    2)COALESCE()を使用して、NULLの値を実際の値に置き換えます。これがクエリが機能しない第2の理由です。一致するものがない場合、bookings.places_bookedがnullの場合、条件はNULL < flights.max_passengerとしてレンダリングされ、常にfalseになります。

    GROUP BY flights.id 
    HAVING COALESCE(sum(bookings.places_booked),0) < MAX(flights.max_passengers) 
    ORDER BY flights.id 
    
    関連する問題