【问题标题】:Print the most watched videos for each category打印每个类别的观看次数最多的视频
【发布时间】:2018-07-21 23:51:30
【问题描述】:

我有两张桌子

video(id,macro_categoria,categoria,titolo)

video_logs(id,idvideo,logs)

(存储观看视频的次数)。 关系是一对多id=>idvideo 我想要这样的结果:

  macro_categoria:one {
          [1]=> video 1 details
          [2]=> video 2 details
          [3]=> video 3 details
          [4]=> video 4 details
        }
  macro_categoria:two {
          [1]=> video 1 details
          [2]=> video 2 details
          [3]=> video 3 details
          [4]=> video 4 details
        }

上面的数组打印了每个macro_categoria的四个观看次数最多的视频。视频的观看次数取自表video_logs的日志。目前我在这一点上,我卡住了:

SELECT c.macro_categoria,c.id, Count((v.id)) as Views
 FROM video c,video_log v
 WHERE c.id = v.idvideo
 GROUP BY c.id 
 ORDER BY Views DESC LIMIT 4

这回响:

[0] => Array
        (
            [macro_categoria] => macro2
            [id] => 11
            [Views] => 47
        )

[1] => Array
    (
        [macro_categoria] => macro1
        [id] => 12
        [Views] => 23
    )

【问题讨论】:

  • 这里有什么问题?
  • @rtfm 打印每个宏类别中观看次数最多的四个视频
  • 查询一个join,一些聚合,php中不用统计
  • 加入只会让我获得已观看的视频...好吧,但是我如何以这种方式打印它并且只有 4 个观看次数最多的视频 @rtfm
  • 您需要计数、分组依据、排序依据和限制

标签: php mysql sql arrays


【解决方案1】:

这是一个查询,用于选择每个类别的计数:

SELECT videos.id, cats.macro_categoria, videos.titolo, IFNULL(views.cnt, 0) AS cnt 
FROM (SELECT DISTINCT macro_categoria FROM `video`) cats 
JOIN (SELECT id, macro_categoria, titolo FROM video) videos ON videos.macro_categoria = cats.macro_categoria 
LEFT JOIN (SELECT idvideo, COUNT(idvideo) as cnt FROM video_log GROUP BY idvideo) `views` ON `views`.idvideo = videos.id 
ORDER BY cats.macro_categoria, cnt DESC

在这里,我们从类别列表开始,(INNER) 将视频加入这些类别,然后 LEFT 加入观看次数,这样我们仍然有 NULL 结果,因此您可以知道哪些地方没有观看。然后按类别和视图进行降序排序。

如果你想在 PHP 中获得每个类别的前四个成员,你可以使用如下逻辑(有点伪代码):

$result = DB::query($sql);
$byCategory = [];
while ($row = DB::fetchAssoc($result)) {
    // Create array to hold category
    if (!isset($category[$result['macro_categoria']))
        $category[$result['macro_categoria'] = [];

    // Store record
    $byCategory[$result['macro_categoria']][] = $result;
}

// Trim results per category
foreach ($byCategory AS $cat=>$data)
    $byCategory[$cat] = array_slice($data, 0, 4);

array_slice 获取每个类别的前四个元素。只要结果集从服务器正确排序,这将返回最高值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多