【问题标题】:Counting row occurrences and printing them计算行出现并打印它们
【发布时间】:2017-01-05 16:28:36
【问题描述】:

名为 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;

【问题讨论】:

  • 你可以创建一个带有标签“key”的数组
  • 请始终提及您的确切 CakePHP 版本 (x.x.x),并相应地标记您的问题 - 谢谢!

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


【解决方案1】:

您可以通过利用基本 SQL 逻辑来做到这一点,例如 count 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;

另见

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 您在标签之前错过了 $。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2013-10-03
    • 1970-01-01
    • 2021-03-01
    相关资源
    最近更新 更多