2017-05-09 1 views
-1

항공사, 항공편, 정보 등 3 개의 테이블이 있습니다.laravel complex sql query

  1. 모든 항공사는 "많은 항공편"을 가지고 있습니다.
  2. 모든 항공편에 "많은 정보"가 있습니다.
  3. 모든 항공사에는 "through through infos"가 있습니다.

내가이 정보를 얻기 위해 쿼리 쿼리 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

덕분에 .. (아이디, airlinename, infos_count) "A.id에 의해 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');