У каждой статьи есть поле тегов в базе данных в формате: тег1, тег2, другой тег, снова с тегом
Ваша база данных не нормализована. Теперь вы должны заплатить цену с точки зрения повышенной сложности.
Вы должны просмотреть все свои записи, взять поле тегов и подвести итоги. Вот так:
$counts = array();
$result = mysql_query('SELECT tags FROM articles');
while ($record = mysql_fetch_array($result))
{
$record_tags = split(',', $record['tags']);
foreach ($record_tags as $tag)
{
++$counts[$tag];
}
}
Теперь $counts
- это массив, в котором тегами являются ключи, а частотой - значения.
Конечно, это создает ужасную нагрузку на базу данных. Лучшим решением является нормализация базы данных: добавьте таблицу article_tags
со столбцами tag
и article
, где article
- это внешний ключ, указывающий на таблицу articles
. tag
является либо самим литеральным тегом, либо внешним ключом в таблицу tags
. Последнее необходимо, если вы хотите хранить метаинформацию о тегах (описание, синонимы и т. Д.).
Если вы сделали это, код уменьшается до
$counts = array();
$result = mysql_query(
'SELECT tag, COUNT(*) AS cnt FROM article_tags GROUP BY tag'
);
while ($record = mysql_fetch_array($result))
{
$counts[$record['tag']] = $record['cnt'];
}
Кроме того, ознакомьтесь с нормализацией базы данных, например, Википедия: Нормализация базы данных , если вы этого еще не сделали.