2017-05-09 22 views
-1

私は3つのテーブルを持っています:航空会社、航空会社、情報。laravel complex sql query

  1. すべての航空会社には「多数の」飛行があります。
  2. すべての便に「たくさんの」情報があります。
  3. すべての航空会社には「多くの通過」情報があります。

私は、この情報を取得するには、クエリ、クエリDBまたは雄弁ORMを必要とする:

--------------------------------------------------------------- 
    id | airline_name | infos_count | infos_canceled | infos_late 
--------------------------------------------------------------- 
    1  b_airline   6    2   5(minutes) 


airline_name: name of airline company 

infos_count: count of info which belong to flight table and this airline company 

infos_canceled: count of info where (status=0) 

infos_canceled: sum of (subtract time of schedule_time) 

Tables diagram

任意のヘルプは ..してください私はこの使用してトランスクラスをしましたが、私は、この使用してクエリをしたいです。 。

答えて

1

これを試してみてください:

SELECT A.id 
    , A.name AS 'airline_name' 
    , COUNT(I) AS 'infos_count' 
    , COUNT(CASE WHEN I.status = 'Canceled' THEN 1 ELSE 0 END) AS 'infos_canceled' 
    , COUNT(CASE WHEN I.status = 'Late' THEN 1 ELSE 0 END) AS 'infos_late' 
    FROM airlines A 
    INNER JOIN flights F 
      ON A.id = f.airline_id 
    INNER JOIN infos I 
      ON F.id = I.flight_id 
あなたの答えのための
+0

おかげで...(ID、airlinename、infos_count) "A.id BY GROUP" アドオンで働いていたが、キャンセルと後期 –

+0

何フィールドが動作しませんステータスがキャンセルされたか遅れているかを判断しますか? – Jake

0

感謝@Jakeを、私の答え:あなたの答えのための

Airline::select([ 
       'airlines.id', 
       'airlines.name', 
       \DB::raw('count(*) as flight_count'), 
       \DB::raw('CAST(SUM(i.time-i.schedule_time) AS time) as flight_late'), 
       \DB::raw('count(CASE WHEN i.status = 0 THEN 1 ELSE NULL END) as canceled_count') 
      ]) 
       ->join('flights as f', 'f.airline_id', '=', 'airlines.id') 
       ->join('infos as i', 'i.flight_id', '=', 'f.id') 
       ->groupBy('airlines.id');