在与约会相关的大多数关系中,爱吵架的人都会吵架



我正在与Laravel合作,我目前的任务是获得上周播放的前10首歌曲。

$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秒,每个循环使用一个。

如果只想计算给定日期范围内的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')]);

最新更新