2017-01-05 40 views
1

名为Tags的MySQL表包含2列:具有超过100k行的tags和video_id。 他们都不是主键,这意味着在标签列中的值可能与不同VIDEO_ID发生几次,例如:计算行发生次数并将它们打印

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

我怎么能指望每个标签的所有事件和打印?喜欢的东西:

TAG1(2个视频)

标签2(3个视频)

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

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

变量标签现在有结果,这就是我如何打印出来:

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

得到结果,你可以用一个标签创建一个数组”关键“ –

+1

请永远记住离开您的确切CakePHP版本(x.x.x),并相应地标记您的问题 - 谢谢! – ndm

+0

http://stackoverflow.com/questions/32584003/cakephp-3-count-group-find-result的可能重复 –

回答

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; 

参见

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; 
+0

您在标记之前错过了$。 –

+0

@ManoharKhadka更新,谢谢 – tarikul05

相关问题