是否可以更改此SQL以使其在Laravel上运行?
SELECT name, event,m.season_id, tm.played_pugs, active, m.created_at, datediff(now(),m.created_at)
FROM matchs m
LEFT OUTER JOIN seasons ON seasons.id = m.season_id
JOIN ( SELECT season_id, max(matchs.created_at) as MaxDate, count(season_id) as played_pugs
FROM matchs
GROUP BY season_id) tm on m.season_id = tm.season_id and m.created_at = tm.MaxDate
ORDER BY played_pugs descc>
这是我到目前为止所做的:
$seasons = DB::table('matchs')
->select('name', 'event', 'season_id', 'played_pugs', 'active', DB::raw('datediff(now(),created_at) as days'))
->join('seasons', 'seasons.id', '=', 'matchs.season_id', 'left outer')
->join(DB::raw('SELECT season_id, max(matchs.created_at) as MaxDate, count(season_id) as played_pugs FROM matchs GROUP BY season_id)'), '')
->orderBy('played_pugs','desc')
->get();
此外,我无法通过“play_pugs'那个有0的价值了。我该如何解决这个问题。
答案 0 :(得分:0)
这将生成您发布的确切查询。我使用单独的Query Builder对象构建了join子查询,并使用toSql()
方法使用DB::raw()
来生成要生成的SQL字符串,因为它以这种方式更具可读性并且使用查询生成器语法。
$joinSubquery = DB::table('matchs')
->select('season_id', DB::raw('max(matchs.created_at) as MaxDate'), DB::raw('count(season_id) as played_pugs'))
->groupBy('season_id')
->toSql();
$seasons = DB::table('matchs m')
->select('name', 'event', 'm.season_id', 'tm.played_pugs', 'active', 'm.created_at', DB::raw('datediff(now(), m.created_at)'))
->leftJoin('seasons', 'season.id', '=', 'm.season_id', '')
->join(DB::raw('(' . $joinSubquery . ') tm'), function ($join)
{
$join->on('m.season_id', '=', 'tm.season_id');
$join->on('m.created_at', '=', 'tm.MaxDate');
})
->orderBy('played_pugs', 'desc')
->get();