Как получить строки из таблицы статей 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