在迁移中创建数据库视图 laravel 5.2
Creating database view in migration laravel 5.2
我正在尝试通过 Laravel 5.2 中的迁移创建数据库视图,因为我需要将相当复杂的查询交给视图。我有联赛、球队、球员和积分的模型/tables。每一个都与它之前的一个有 hasMany / belongsTo 关系。目标是创建一个 table,其中每一行都是联赛名称、联赛所有剩余积分的总和以及 points.remnants 的计数,其中 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);
' );
这不会引发任何错误,但它只会 returns 一行,并且总和是所有联赛中的所有积分。
我正在寻找的是创建一个 table,其中每个联赛都有一行,其中包含联赛名称、该联赛剩余的总积分以及每个联赛剩余积分少于 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
问题在于您将 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);
我重新格式化了一下,让它更清晰一些。 SQL 关键字是大写的,各个子句是分开的。我们在这里所做的是指定列,然后是 table 规范 - 首先是 leagues
table,然后是其他 table 连接到那个。
我正在尝试通过 Laravel 5.2 中的迁移创建数据库视图,因为我需要将相当复杂的查询交给视图。我有联赛、球队、球员和积分的模型/tables。每一个都与它之前的一个有 hasMany / belongsTo 关系。目标是创建一个 table,其中每一行都是联赛名称、联赛所有剩余积分的总和以及 points.remnants 的计数,其中 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);
' );
这不会引发任何错误,但它只会 returns 一行,并且总和是所有联赛中的所有积分。
我正在寻找的是创建一个 table,其中每个联赛都有一行,其中包含联赛名称、该联赛剩余的总积分以及每个联赛剩余积分少于 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
问题在于您将 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);
我重新格式化了一下,让它更清晰一些。 SQL 关键字是大写的,各个子句是分开的。我们在这里所做的是指定列,然后是 table 规范 - 首先是 leagues
table,然后是其他 table 连接到那个。