6

かなり複雑なクエリをビューに渡す必要があるため、Laravel 5.2の移行でデータベースビューを作成しようとしています。私は、リーグ、チーム、選手、そしてポイントのためのモデル/テーブルを持っています。それぞれの前にhasMany/belongsTo関係があります。目標は、各行がリーグ名であり、リーグの残りのポイントの合計と、ポイントの数がカウントされるテーブルを作成することです。残額> points.remnants> 4の値。移行時のデータベースビューの作成laravel 5.2

メジャー編集:

私がこれまで持っていると、これはすべてのエラーをスローしませんが、それだけで1行を返し、合計はすべてのリーグですべての点についてです

  DB::statement('CREATE VIEW wones AS 
     SELECT 
      leagues.name as name, 
      sum(points.remnants) as trem, 
      count(case when points.remnants < 4 then 1 end) as crem 
    FROM leauges 
     JOIN teams ON (teams.league_id = leagues.id) 
     JOIN players ON (players.team_id = teams.id) 
     JOIN points ON (points.player_id = players.id); 
    '); 

です。

私が探しているのは、各リーグのリーグ名、そのリーグの残りの合計ポイント、リーグごとの残りのポイントが4未満のテーブルがあるテーブルを作成することです。

解決済みとマークされます。この問題のほとんどは、受け入れられた回答を参照してください。 1行の問題は、count()でGROUP BYを使用していなかったためです。

+0

DB :: statement()はそのままクエリを実行しますので、問題はlaravelとは関係ありません。このクエリをcliで直接実行しようとしましたか? –

+0

ああ。私はそれを考えすぎているかもしれません。私がSQLでそれを実行する場合、数と合計はジョインの前に選択されます。私がララベルでそれを試してみると、それはエラーを投げます –

答えて

3

私の問題はあなたのSQL構文だと思います。ここではあなたが書いたものだ:

CREATE VIEW wones AS SELECT (name from leagues) AS name 
join teams where (leagues.id = team.country_id) 
join players where (teams.id = players.team_id) 
join points where (players.id = points.player_id) 
sum(points.remnants) AS trem 
count(points.remnants where points.remnants < 4) AS crem 

問題は、あなたが列仕様のFROMJOIN句を混入してきた方法です。これを試してみてください:

CREATE VIEW wones AS 
SELECT 
    leagues.name, 
    sum(points.remnants) AS trem 
    sum(IF(points.remnants<4, 1, 0)) AS crem 
FROM leagues 
    JOIN teams ON (leagues.id = team.country_id) 
    JOIN players ON (teams.id = players.team_id) 
    JOIN points ON (players.id = points.player_id); 

私はそれをもう少し明確にするために少し書式を変更しました。 SQLキーワードは大文字になり、さまざまな句がそれぞれの行に分かれています。ここでは、カラムを指定し、続いてテーブル指定を指定します。まず、leaguesテーブルを作成し、次にそのテーブルに結合します。

+0

あなたは大抵正しいです。私はすべてをEloquentに翻訳しようとしていることが頭の中に入っていることを知っています。私は今、基本的なSQL構文で愚かな間違いを犯しています。あなたが配置したクエリははるかに良く見えますが、count()で構文エラーがスローされます。 –

+0

WHERE句をcount()とsum()の両方に適用するのと同じではないと思うので、count()にのみ適用してください。 –

+0

もう一度編集します - テーブルのすべての行に 'points.remnants'の合計と' points.remnants' <4の行数の合計が必要であると仮定しています。値が4より小さい場合は1を加算し、それ以外の場合は0を加算します。 – Kryten

関連する問題