我在编写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
答案 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上都有索引。