【问题标题】:MySQL Query for Tagging System, Selecting Used Tags Only标记系统的 MySQL 查询,仅选择使用的标记
【发布时间】:2011-09-29 23:33:38
【问题描述】:

我有一个用 PHP 和 MySQL 实现的标记系统,有以下表格:

表:blog_tags

  • tag_id
  • 标签名称

表:blog_tags_assoc

  • tag_assoc_id
  • article_id
  • tag_id

表:blog_articles

  • article_id
  • article_title
  • article_content

我使用多对多关系将它们全部链接起来 (参考类似的东西:How to store tags in MySQL tags, one field in total or one filed for each tag?)

我现在要做的是做一个 MySQL 查询,从 blog_tags 中选择所有标签,这些标签实际上已被 blog_articles 中的文章引用。

到目前为止,我知道我可能会使用“HAVING”……但我不确定如何使用? 任何想法或建议都将受到欢迎。谢谢!

【问题讨论】:

    标签: php mysql tags


    【解决方案1】:

    如果你只想知道文章中已经使用过的标签,那么你可以这样做:

    SELECT DISTINCT tag_id, tag_name
    FROM blog_tags
    INNER JOIN blog_tags_assoc USING ( tag_id );
    

    【讨论】:

    • 谢谢!还有一种方法可以计算此查询中每个标签的结果数吗?如何在 PHP 中检索它?
    【解决方案2】:

    这将获得标签名称以及已使用该标签的文章计数。

    SELECT
        `blog_tags`.`tag_name`,
        count(*) AS `blog_article_count`
    FROM `blog_tags`
        JOIN `blog_tags_assoc`
            ON `blog_tags`.`tag_id`=`blog_tags_assoc`.`tag_id`
        JOIN `blog_articles`
            ON `blog_articles`.`article_id`=`blog_tags_assoc`.`article_id`
    GROUP BY `blog_tags`.`tag_name`
    

    【讨论】:

    • 谢谢!!有没有更有效的方法来写这个?这么多的 JOIN 似乎很浪费资源
    • @Jay 我猜 blog_articles 加入是不需要的。我想我刚刚看到了所有 3 张桌子,我的思绪将它们全部连接在一起。联接实际上在效率方面还不错。另一种选择是使用子查询而不是联接来获取计数,但我认为联接更好(不是 dba,只是根据经验)。
    • 我明白了 - 我按照您的建议删除了最后一个加入,它的效果非常好。再次感谢!!
    猜你喜欢
    • 2012-01-07
    • 2014-07-26
    • 2012-08-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2011-07-06
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多