Bli*_*ish 7 laravel laravel-migrations laravel-5.2 laravel-query-builder
我正在尝试通过Laravel 5.2中的迁移创建数据库视图,因为我需要将相当复杂的查询交给视图.我有联盟,球队,球员和积分的模特/桌子.每个人都有一个hasMany/belongsTo关系与之前的关系.目标是创建一个表格,其中每一行都是联盟名称,联盟所有剩余点数的总和,以及点数的数量.其中points.remnants> 4的值.
主要编辑:
到目前为止我所拥有的是什么
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);
' );
Run Code Online (Sandbox Code Playgroud)
这不会引发任何错误,但它只返回一行,并且总和是针对所有联赛中的所有点.
我正在寻找的是创建一个表格,其中每个联盟都有一排,有联盟名称,该联赛的剩余积分总数,以及每个联赛剩余少于4的总积分.
标记为已解决.查看大多数问题的已接受答案.一行问题是因为我没有将GROUP BY与count()一起使用.
在我看来,问题在于您的 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
Run Code Online (Sandbox Code Playgroud)
问题是与你混合的方式FROM和JOIN使用的条款列规范。尝试这个:
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);
Run Code Online (Sandbox Code Playgroud)
我重新格式化了一下,使它更清晰一点。SQL 关键字是大写的,并且各个子句分开到各自的行中。我们在这里所做的是指定列,然后是表规范——首先是leagues表,然后是连接到该表的其他表。