MySQL查询共同作者网络

时间:2014-04-04 10:52:12

标签: mysql sql

我在编写MySQL查询时遇到了一些麻烦。也许你可以帮助我。

我需要知道作者多长时间与另一位作者一起写一本书/文字。我打算使用这些数据来构建一个图表,显示共同作者的合作。

结果应如下所示:

AuthorID CoauthorID count
01111    02222      5
02222    03333      1
...

由于我在MySQL方面相对缺乏经验,我不知道如何实现这一目标。我的猜测是它需要某种交叉表/矩阵。另一个问题来自共同作者的无向性:

author1 --- author2

相当于:

author2 --- author1

但是我需要这两个作者一起工作的数量,以便查询应该总结为:

author1 --- author2 --- count: 2

这是我数据库结构的一部分:

* = primary key
# = unique

table 'Texts'
-------------
#TextID
*Title
*Year
...

table 'Persons'
---------------
#AuthorID
*Name
*Birth
...

table 'Authorship'
------------------
*AuthorID
*TextID

感谢您的帮助。提前谢谢!

-Andi

1 个答案:

答案 0 :(得分:0)

您需要的只是作者表。它记录每个作者:书籍映射。您要求查找给定作者的文本数量的计数,因此此查询:

Select a.authorid,
 b.authorid as coauthorid,
 count(a.textid) as count
From authorship a
Inner join authorship b
On a.textid = b.textid
Where a.authorid < b.authorid
Group by a.authorid,b.authorid

您将表连接到自身以创建作者配对矩阵。 on条件确保该对在同一文本上工作。 where条件确保删除重复项并且作者不与自己配对; 2-1与1-2相同所以不计算两次,并且不计算3与3合作.group by子句分解作者和共同作者的结果,以便计数函数考虑只有每个配对的文本。

请注意,此查询省略了协作计数为零的配对。为了获得良好的性能,作者应该在authorID和textID上都有索引。

SQL小提琴:http://sqlfiddle.com/#!2/71afa/1/0