我正在与Laravel合作,我目前的任务是获得上周播放的十首歌曲。
$mostPlayed = Track::join('track_tracklist as pl', 'pl.track_id', '=', 'tracks.id')
->groupBy('tracks.id')
->orderBy('count','desc')
->take(10)
->get(['tracks.*', DB::raw('COUNT(pl.track_id) as count')]);
此查询工作正常,它返回了我播放的10首歌曲,但没有日期限制。因此,我需要将连接的跟踪列表限制为给定日期(应与跟踪列表中存储的日期进行比较),但我不知道如何添加它。
谢谢:)
更新
我找到了一个可能的解决方案,但效率不高。上面的代码需要 0.009023904800415秒,代码低于0.96272301673889,需要100%的时间。当然上面的代码更快,因为它没有比较日期,但应该有更好的方法来解决问题。
$time = '2015-05-01';
$elements = [];
$maxArray = [
'element' => null,
'count' => 0
];
for ($i = 0; $i < 10; $i++) {
$elements[] = $maxArray;
}
foreach (Track::all() as $track) {
$tracklists = $track->tracklists()->where('time', '>=', $time)->get();
for ($i = 0; $i < count($elements); $i++) {
if (count($tracklists) > $elements[$i]['count']) {
array_splice($elements, $i, 0, [[
'element' => $track,
'count' => count($tracklists)
]]);
array_pop($elements);
break;
}
}
}
解 jedrzej.kurylo接近解决方案,只是忘记了第一次加入呼叫的一个参数:
$time = '2015-07-02';
$mostPlayed = Track::join('track_tracklist', 'track_tracklist.track_id', '=', 'tracks.id')
->join('tracklists', function ($join) use ($time) {
$join->on('tracklists.id', '=', 'track_tracklist.tracklist_id')->where('tracklists.time', '>=', $time);
})
->groupBy('tracks.id')
->orderBy('count', 'desc')
->take(10)
->get(['tracks.*', DB::raw('COUNT(track_tracklist.track_id) as count')]);
将返回今天和给定日期之间播放的前10首曲目,需要0.01秒而不是1秒,每次循环使用a。
答案 0 :(得分:1)
如果您只想计算给定日期范围内的track_tracklist记录,则需要在JOIN上应用其他约束:
$time = '2015-05-01';
$mostPlayed = Track::join('track_tracklist as pl','pl.track_id', '=', 'tracks.id')
->join('tracklists', function($join) use ($time) {
$join->on('pl.tracklist_id', '=', 'tracklists.id');
$join->where('tracklists.time', '>=', $time)
})
->groupBy('tracks.id')
->orderBy('count','desc')
->take(10)
->get(['tracks.*', DB::raw('COUNT(pl.track_id) as count')]);