使用纯SQL来匹配表中的行对?

Siw*_*申思维 2 sql self-join

注意:这个问题对"程度"有一个模棱两可的概念.我已经得到了答案.

这些天我正在努力解决下面这样的问题:你不能用一些编程语言编写函数; 仅使用RAW SQL.

给定一个articles包含2列的表:article_idtag_name

article_id  |  tag_name
---------------------------
1              C++
1              java
1              python
2              ruby
2              js
3              ruby
4              java
4              python
Run Code Online (Sandbox Code Playgroud)

还有一个名为'tag_relations'的空表,结构如下:

tag1     |   tag2    |  degree
-----------------------------------
Run Code Online (Sandbox Code Playgroud)

现在,问题来了:

  • 编写一个"RAW SQL",根据第一个表的内容将值写入表'tag_relations'.

对于给定的数据,输出应该是这样的(我不确定程度是多少,而且问题没有提到这一点,因此,Gordon Linoff和Jonathan Leffler的答案对我来说都是正确的.):

tag1     |   tag2    |  degree
-----------------------------------
java         C++        2
java         python     4
ruby         js         2
Run Code Online (Sandbox Code Playgroud)

更新的附加信息

注1:此处问题没有描述"学位".但是我认为这是衡量2个标签之间关系的一个指标.由于'java'和'C++'有值:

article_id  |  tag_name
---------------------------
1              C++
1              java
Run Code Online (Sandbox Code Playgroud)

所以程度= 2

并为'java'和'python'

article_id  |  tag_name
---------------------------
1              java
1              python
4              java
4              python
Run Code Online (Sandbox Code Playgroud)

所以程度= 4

注2:
没有学历的记录:'python'和'C++',(我的意思是这个问题并不是指那些情况degree < 2)(编者注:这个注释与输出中包含C++和Java不一致. )

我花了一天时间研究这个问题,并回顾了我对SQL的了解,但仍然不知道如何存储变量或循环记录.

任何想法将不胜感激!

Gor*_*off 6

学位是多少?它似乎是连接两件事的最大文章ID.

此查询需要自联接(和插入):

insert into tag_relations(tag1, tag2, degree)
    select a1.tag_name, a2.tag_name, max(article_id) as maxid
    from articles a1 join
         articles a2
         on a1.article_id = a2.article_id and
            a1.tag_name < a2.tag_name
    group by a1.tag_name, a2.tag_name
Run Code Online (Sandbox Code Playgroud)

自联接查找具有相同article_id的所有项目对."<"只是确保颠倒顺序不会创建新对.对于任何对,最大article_id将被视为新学位.