2014-04-04 24 views
0

我在編寫MySQL查詢時遇到了一些麻煩。也許你可以幫助我。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

如果3周或更多的作者在文本協作會發生什麼?你的模型如何解釋? –

+0

由於表'Authorship'的PK由AuthorID和TextID組成,我可以爲每個文本輸入2個以上的作者。這有問題嗎? – kabauter

回答

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 

你加入了表本身創造筆者配對的矩陣。接通條件可確保雙方在相同的文本上工作。 Where條件確保重複項被刪除,並且作者不與自己配對; 2-1與1-2相同,因此不要將其計爲兩次,並且不要指望3與3合作。group by子句將作者和合着者的結果分開,以便count函數考慮只有爲每個單獨配對找到的文本。

請注意,此查詢省略協作計數爲零的配對。爲了獲得良好的性能,作者身份應該在authorID和textID上都有索引。

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

+0

非常感謝!這是否考慮到每個文本超過2個作者? 假設文本1是由作者1,作者2和作者3撰寫的,每個作者是否會被視爲與其他作者合作的作者? 例如: - 作者1 - author2數:1個 author2 - author3數:1名 作者1 - author3數:1 – kabauter

+0

- 是的,這完美的作品! – kabauter