2009-12-24 21 views
1
Table tags: 
article_id  tag 
1    Language 
1    Java 
1    c++ 
2    Language 
2    c++ 
3    c++ 

,我怎麼能寫SQL(S)查詢(S),以使數據象下面這樣:如何通過使用SQL(s)來獲得標籤關係結果?

Table tags_relations: 

tag1  tag2  relations_degree 
Language C++  2 
Language Java 1 

注:如果標籤是指則在同一篇文章中relations_degree + 1

這種方法的目的是計算標籤之間的關係,任何一個人都可以幫我解決這個問題?

回答

3

喜歡的東西:

SELECT A.tag AS tag1, B.tag AS tag2, COUNT(*) as relations_degree 
FROM tags A 
    INNER JOIN tags B ON A.article_id = B.article_id 
WHERE A.tag = 'Language' AND a.tag <> b.tag 
GROUP BY A.tag, B.tag 
ORDER BY B.tag ASC 

根據你的榜樣,我以爲你是將其限制在標籤1 =「語言」,否則有標籤1 = Java中,標籤2 = C++,relations_degree = 1的情況下獲取:

SELECT A.tag AS tag1, B.tag AS tag2, COUNT(*) as relations_degree 
FROM tags A 
    INNER JOIN tags B ON A.article_id = B.article_id 
WHERE A.tag > b.tag 
GROUP BY A.tag, B.tag 
ORDER BY B.tag ASC 
+0

謝謝,這是正確的。但是,你能解釋一下,如果左邊加入會更好嗎?還有什麼是A.tag> B.tag呢?謝謝。 – 2009-12-24 03:35:26

+0

我在那裏添加了a.tag> b.tag以使結果具有唯一性。否則,結果集中的行看起來像「Language C++ 2」,後面是「C++ Language 2」,我假定您不需要這些行。在這種情況下,內部聯接將導致您只能看到results_degree> = 1的結果,而切換到左側聯接會顯示像「語言NULL 1」這樣的行,您可能不想這樣做。 – Dathan 2009-12-24 03:41:01

0

我想你應該有某種「標籤式」,讓你的一套看起來更像:

article_id tag tag_type 
1   Java Language 
1   c++ Language 
2   c++ Language 
3   c++ Other 

然後,您可以輕鬆使用COUNT(*),按tag_typetag分組。

假設(沒有試圖將U和ME作爲PRES),你有一堆其他tag_types,那麼我不知道如何最好地將tag_types分配給標籤,並且你可能會發現比我更容易。但這絕對是一條路。

+0

感謝您的回答,但這裏的難點在於找出標籤之間的關係,因此沒有每個標籤的tag_type。 '語言','java'是一篇文章上的標籤。 – 2009-12-24 04:04:14

+0

啊,好吧......我誤解了。我以爲你的意思是「有Java語言,還有C++語言」。所以如果Java和C++在同一篇文章中出現在一起,你也希望它能夠出現? – 2009-12-24 04:35:40

+0

是的,我知道你現在的意思。 – 2009-12-24 04:58:01

相關問題