2017-01-05 8 views
1

タグという名前のMySQLテーブルには、100k行以上のタグとvideo_idという2つの列が含まれています。それらの どれもタグ列の値は、例えば、異なる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; 
+0

によって結果を取得することができますCakePHPのcount()機能とGroupオプション

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

を使用することができますキー " –

+1

必ずご記入ください正確なCakePHPのバージョン(x.x.x)を作成し、それに応じてあなたの質問にタグを付けてください - ありがとう! – ndm

+0

可能な複製http://stackoverflow.com/questions/32584003/cakephp-3-count-group-find-result –

答えて

3

たとえば、video_id(または特定の状況ではパフォーマンスを向上させる可能性のある*)などの基本的なSQLロジックを活用し、tagsでグループ化することで、そうすることができます。

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

結果のエンティティはあなたが他のプロパティのようにアクセスすることができますcountプロパティを保持します:

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

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

この

は次のようにクエリを作成します。ここではさらに、複数の意識変換機能(必ず必要ですが、役に立つかもしれない)を使用して、小さな例です:

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

2

あなたは「あなたがタグを使用して配列を作成することができます

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

タグの直前に$が見つかりませんでした。 –

+0

@ManoharKhadkaが更新されました – tarikul05

関連する問題