【问题标题】:How to get the tag relations results just by using SQL(s)?如何仅使用 SQL(s) 获取标签关系结果?
【发布时间】:2010-12-29 17:08:12
【问题描述】:
Table tags:
article_id     tag
1              Language
1              Java
1              c++
2              Language
2              c++
3              c++

以及如何编写 SQL(s) 查询以生成如下所示的数据:

Table tags_relations:

tag1        tag2     relations_degree
Language    C++     2
Language    Java    1

注意:如果标签指的是同一篇文章,那么relationship_degree + 1

这种方法的目的是计算标签之间的关系,有人可以帮我吗?

【问题讨论】:

    标签: sql tagging database-relations


    【解决方案1】:

    类似:

    SELECT A.tag AS tag1, B.tag AS tag2, COUNT(*) as relations_degree
    FROM tags A
         INNER JOIN tags B ON A.article_id = B.article_id
    WHERE A.tag = 'Language' AND a.tag <> b.tag
    GROUP BY A.tag, B.tag
    ORDER BY B.tag ASC
    

    根据您的示例,我假设您将其限制为 tag1 = 'Language',否则会出现 tag1 = Java,tag2 = c++,relationship_degree = 1 的情况。要做到这一点:

    SELECT A.tag AS tag1, B.tag AS tag2, COUNT(*) as relations_degree
    FROM tags A
         INNER JOIN tags B ON A.article_id = B.article_id
    WHERE A.tag > b.tag
    GROUP BY A.tag, B.tag
    ORDER BY B.tag ASC
    

    【讨论】:

    • 谢谢,这是正确的。但是你能解释一下左连接会更好吗?另外 A.tag > B.tag 是做什么的?谢谢。
    • 我在那里添加了 a.tag > b.tag 以使结果独一无二。否则,结果集中的行看起来像“Language c++ 2”,然后是“c++ Language 2”,我假设你不想要。在这种情况下,内连接将导致您只能看到关系度 >= 1 的结果,而切换到左连接会显示像“语言 NULL 1”这样的行,这可能是您不想要的。
    【解决方案2】:

    我认为你应该有某种“标签类型”,这样你的集合看起来更像:

    article_id   tag   tag_type
    1            Java  Language
    1            c++   Language
    2            c++   Language
    3            c++   Other
    

    然后您可以轻松地使用COUNT(*),按tag_typetag 分组。

    假设(不尝试从 U 和 ME 中创建 PRES)您有一堆其他 tag_types,那么我不确定如何最好地将 tag_types 分配给标签,您可能会发现这比我更容易。但这绝对是要走的路。

    【讨论】:

    • 感谢您的回答,但这里的困难在于仅找出标签之间的关系,因此每个标签都没有tag_type。 'language','java' 是一篇文章的标签。
    • 啊,好吧...我误会了。我以为你的意思是“有 Java 语言,还有 C++ 语言”。因此,如果 Java 和 C++ 一起出现在同一篇文章中,您是否希望它也出现?
    • 是的,我知道你现在的意思了。
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2014-07-22
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多