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

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

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


person Tomasz Smykowski    schedule 05.12.2009    source источник


Ответы (2)


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

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

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

person Zorglub    schedule 05.12.2009

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

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
person Emil H    schedule 05.12.2009
comment
У вас все наоборот - текущее состояние данных денормализовано. Изменение его на 3NF будет отражать таблицы, которые вы предлагаете. - person OMG Ponies; 05.12.2009
comment
Ага. Виноват. Честно говоря, я не могу сказать, о чем я думал. - person Emil H; 05.12.2009