В моей базе данных есть таблица статей с названием статьи и тегами статьи. Теги статьи - это строковый столбец с тегами в нем следующим образом: "люди, жизнь, президент". Каждая статья помечена таким образом.
Теперь я хотел бы получить 10 самых популярных тегов для всего контента статей. Как это сделать?
Если у вас есть такая возможность, лучше измените схему базы данных, чтобы иметь таблицу статей, таблицу тегов и таблицу 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
-table, содержащий tag_name
и a 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