Как получить строки из таблицы статей 10 самых популярных тегов?

В моей базе данных есть таблица "Статьи" с названием статьи и тегами статьи. Теги статьи представляют собой строковый столбец с тегами, например: "люди, жизнь, президент". Каждая статья помечена таким образом.

Теперь я хотел бы получить 10 самых популярных тегов для всего населения статей. Как это сделать?

2 ответа

Решение

Если у вас есть такая возможность, лучше измените схему базы данных, чтобы иметь таблицу article, таблицу тегов и таблицу article_tags.

Это позволит гораздо более эффективно сопоставлять теги (например, те, которые вы хотите сделать), особенно если у вас много статей.

С вашим текущим дизайном вы застряли на полной итерации по (предположительно большой) таблице статей и поддержании кучи тегов (либо через временную таблицу - в этом случае вы можете сделать это с помощью хранимой процедуры - или в аппликативном коде). Целое было бы действительно неэффективно.

Было бы намного проще, если бы вы нормализовали базу данных и создали отдельную таблицу тегов. Например, если у вас есть такая база данных:

article
    article_id
    article_title
    article_content

article_tag
    tag_name
    article_id
    UNIQUE INDEX (tag_name, article_id)
    UNIQUE INDEX (article_id, tag_name) # in order to perform fast lookups in both directions

(Это может быть нормализовано еще дальше, создав tagтаблица, которая содержит tag_name и tag_idи замена tag_name с tag_id в article_tag.)

Теперь вы можете представить список самых популярных тегов с помощью запроса, такого как:

SELECT tag_name, count(article_id) c 
  FROM article_tag
  GROUP BY tag_name
  ORDER BY c DESC
  LIMIT 10
Другие вопросы по тегам