【问题标题】:Making a tag cloud - No valid source of tags制作标签云 - 没有有效的标签来源
【发布时间】:2010-12-26 22:22:36
【问题描述】:

所以我的数据库中有几千篇文章被索引,我想根据有多少文章有这些标签来制作一个标签云,所以如果 1000 篇文章有“全球”标签,它会比“国家”标签,仅在 500 篇左右的文章中出现。这个概念似乎并没有让我很困惑,除了我没有有效的标签来源。

看到每篇文章在数据库中都有一个tags字段,格式为: 标签1,标签2,另一个标签,再次与标签

所以我打算做一个 DISTINCT 查询来获取所有不同的标签,但我意识到这只会收集所有不同的标签排列。那么如何查询我的数据库中使用的所有不同标签及其数量?

谢谢大家。

【问题讨论】:

  • 有很多方法可以解决这个问题,实际上有很多方法,因为它必须分解成多个部分,并且每个部分都可以以不同的方式完成。最好的学习方法是尝试一下,如果遇到困难,请回来寻求帮助。

标签: php sql mysql tags distinct


【解决方案1】:

看到每篇文章在数据库中有一个tags字段,格式为:tag1,tag2,anothertag,againwiththetag

您的数据库未标准化。现在您必须为复杂性的增加付出代价。

您必须浏览所有记录,获取标签字段并汇总总数。像这样:

$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,其中包含tagarticle 列,其中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'];
}

另外,阅读数据库规范化,例如Wikipedia: Database normalization,如果你还没有这样做的话。

【讨论】:

    【解决方案2】:

    更改数据库架构以规范化标签应该是一个相当简单的练习。

    你应该有一个标签表,而不是标签列:

    create table tags
    (
      id int,
      name varchar2(50),
      ...
    )
    

    由于关系显然是多对多的,因此您需要一个链接表:

    create table articles_tags
    (
        article_id int,
        tag_id
    )
    

    那么将当前标签转换为新类型应该是相当容易的,这里有一些伪代码!

    1) tags = `select id,tags from articles`
    2) for each tag in tags
    3) if tag exists in `tags` get tag ID, else create row in `tags` and get tag id
    4) using article id and tag id, create entry in articles_tags
    5) alter table remove column tags!
    

    这将使您能够通过简单地运行以下命令来创建标签云:

    select t.name,count(*)
    from tags t
    inner join articles_tags at
    on at.tag_id = t.id
    group by t.name
    

    它还可以更容易地促进具有自动完成功能的标签的重用。

    【讨论】:

    • 感谢您为稳定我的数据库提供了一个很好的起点!
    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 2021-04-25
    • 2013-12-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2016-11-10
    • 2012-03-17
    相关资源
    最近更新 更多