首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计数出现的行并打印它们

计数出现的行并打印它们
EN

Stack Overflow用户
提问于 2017-01-05 16:28:36
回答 2查看 71关注 0票数 1

一个名为标记的MySQL表包含两个列:标记和超过100 k行的video_id。它们中没有一个是主键,这意味着标记列中的值可能会在不同的video_id中发生几次,例如:

代码语言:javascript
复制
column names:  |tags|video_id|
values:         tag1 video1
                tag1 video2
                tag2 video4
                tag2 video5
                tag2 video6

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

tag1 (2个视频) tag2 (3段视频)

我的网站基于CakePHP-3,从表中获取行的方式如下:

代码语言:javascript
复制
$query = $this->Tags->find('all');
$tags = $this->paginate($query);

变量标记现在有了结果,我就是这样打印它们的:

代码语言:javascript
复制
foreach ($tags as $tag):
        echo $tag->tags."<br>";
endforeach;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-05 16:59:52

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

代码语言:javascript
复制
$query = $this->Tags->find();
$query = $query
    ->select([
        'tags',
        'count' => $query->func()->count('video_id')
    ])
    ->group('tags');

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

这将创建类似于以下内容的查询:

代码语言:javascript
复制
SELECT tags, COUNT(video_id) as count
FROM tags
GROUP BY tags

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

代码语言:javascript
复制
foreach ($tags as $tag):
    echo $tag->tags . ' (' .
        __n('{0} Video', '{0} Videos', $tag->count, $tag->count) .
    ')<br>';
endforeach;

另请参阅

票数 3
EN

Stack Overflow用户

发布于 2017-01-05 17:03:18

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

代码语言:javascript
复制
$query = $this->Tags->find('all');
$tags = $query->select([ 
              'tags',
              'count' => $query->func()->count('*')
            ])
     ->group('tags');

你可以通过

代码语言:javascript
复制
foreach ($tags as $tag):
        echo $tag->tags."(".$tag->count." Videos)";
endforeach;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41489972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档