一个名为标记的MySQL表包含两个列:标记和超过100 k行的video_id。它们中没有一个是主键,这意味着标记列中的值可能会在不同的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;发布于 2017-01-05 16:59:52
您可以通过利用基本的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;另请参阅
发布于 2017-01-05 17:03:18
您可以使用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;https://stackoverflow.com/questions/41489972
复制相似问题