2017-01-05 9 views
1

Таблица MySQL с тегами содержит 2 столбца: теги и видео_ид с ​​более чем 100 тыс. Строк. Ни один из них не является первичным ключ, который означает, что значения в столбце тегов могут произойти несколько раз с различными идентификаторами видео, например:Подсчет строк и их печать

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

вы можете создать массив с тегами» ключ " –

+1

Всегда помните ion ваша точная версия 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

 Смежные вопросы

  • Нет связанных вопросов^_^