计算行出现次数并打印它们

时间:2017-01-05 16:28:36

标签: php mysql cakephp cakephp-3.0 query-builder

名为Tags的MySQL表包含2列:tags和video_id,行数超过100k。 它们都不是主键,这意味着标签列中的值可能会出现几次不同的video_id,例如:

column names:  |tags|video_id|
values:         tag1 video1
                tag1 video2
                tag2 video4
                tag2 video5
                tag2 video6

如何计算每个标签的所有出现次数并打印出来?类似的东西:

  

tag1(2个视频)

     

tag2(3个视频)

我的网站基于CakePHP-3,我从表中获取行的方式是这样的:

$query = $this->Tags->find('all');
$tags = $this->paginate($query);

变量标签现在有结果,这就是我打印它们的方式:

foreach ($tags as $tag):
        echo $tag->tags."<br>";
endforeach;

2 个答案:

答案 0 :(得分:3)

您可以通过利用基本的SQL逻辑来实现,例如计数video_id(或*,这可能会在某些情况下提供更好的性能)并按tags进行分组。

$query = $this->Tags->find();
$query = $query
    ->select([
        'tags',
        'count' => $query->func()->count('video_id')
    ])
    ->group('tags');

$tags = $this->paginate($query);

这将创建类似于:

的查询
SELECT tags, COUNT(video_id) as count
FROM tags
GROUP BY tags

生成的实体将保存您可以像任何其他属性一样访问的count属性。这是一个小例子,另外使用多个有意识的翻译函数(当然不是必需的,但可能有用):

foreach ($tags as $tag):
    echo $tag->tags . ' (' .
        __n('{0} Video', '{0} Videos', $tag->count, $tag->count) .
    ')<br>';
endforeach;

另见

答案 1 :(得分:2)

您可以使用cakephp count()函数和Group选项

$query = $this->Tags->find('all');
$tags = $query->select([ 
              'tags',
              'count' => $query->func()->count('*')
            ])
     ->group('tags');

你可以通过

获得结果
foreach ($tags as $tag):
        echo $tag->tags."(".$tag->count." Videos)";
endforeach;