2017-05-09 110 views
-1

我有3個表格:航空公司,航班,信息。laravel複雜sql查詢

  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)由加載工作 「GROUP BY A.id」,但取消和延遲不工作 –

+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');