注意:这个问题对"程度"有一个模棱两可的概念.我已经得到了答案.
这些天我正在努力解决下面这样的问题:你不能用一些编程语言编写函数; 仅使用RAW SQL.
给定一个articles包含2列的表:article_id和tag_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)
现在,问题来了:
对于给定的数据,输出应该是这样的(我不确定程度是多少,而且问题没有提到这一点,因此,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的了解,但仍然不知道如何存储变量或循环记录.
任何想法将不胜感激!
学位是多少?它似乎是连接两件事的最大文章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将被视为新学位.