2011-08-29 56 views
3

我有一個藝術網站。我現在需要展示相關的藝術作品。我有3個表:多對多關係標籤匹配?

art_info    : art_id, title 
art_tag_relationship : art_id, tag_id 
art_tags    : tag_id, tag (in text) 

我試圖讓相關技術通過最相關的標籤匹配排序的給定的一件藝術品。

所以現在可以說我有5個藝術品與標籤

藝術#1標籤:紅色,藍色,綠色,黃色
藝術#2標籤:紅色,橙色,紫色,黑色,黃色,藍色
藝術#3標籤:紅
藝術#4標籤:藍色,綠色
藝術#5標籤:白色,棕色

所以現在我想獲得最相關的藝術作品,以藝術#1的順序最匹配到最少匹配。我希望得到這樣的

相關技術,以#1的結果:

  • 最佳匹配=藝術#2(因爲它匹配的3個標籤)
  • 第二節比賽=藝術#4(因爲它匹配2個標籤)
  • 第3場比賽=第3場比賽(因爲它匹配了1個標記)
  • 不顯示第5場比賽,因爲沒有找到比賽。

我正在考慮使用foreach語句,一旦我得到藝術#1的標籤,但這似乎效率低下。

這裏是我用來獲取藝術#標籤1

SELECT art_info.art_id, art_info.title 
FROM art_info 
INNER JOIN art_tag_relationship ON art_info.art_id = art_tag_relationship.art_id 
WHERE art_tag_relationship.art_id = '1' 

所以現在查詢一次我從藝術#1的4個標籤,我如何才能擁有最最藝術相關標籤?

謝謝你的時間和使用大腦。

編輯:概念似乎是,通過art_tag_relationship - > art_tags獲取art#tag的標籤,然後從art_tag_relationships獲取art_id,其中tag_id與art_tag_relationships中art_id#1的找到標籤相同。

回答

1

您可以選擇最相關的藝術作品,給出另一個art_id。

SELECT 
    ai.art_id, 
    ai.title 
    count(DISTINCT r2.tag_id) as relevance 
FROM art_tag_relationship r1 
INNER JOIN art_tag_relationship r2 ON (r1.tag_id = r2.tag_id 
            AND r1.art_id <> r2.art_id) 
INNER JOIN art_info ai ON (r2.art_id = ai.art_id) 
WHERE r1.art_id = '1' -- this is the art_id results should be related to. 
GROUP BY ai.art_id 
ORDER BY relevance DESC 
+0

工程就像一個魅力。絕對美麗的謝謝你!我從來沒有見過使用過的<>。我會更多地閱讀這個。再次感謝! – Darius

+0

@Darius「<>」表示不等於。 – Johan

+0

嘿約翰,我有點過激,它似乎在工作,但是當我測試它時,結果發現它計算了與匹配標籤完全不同的東西。我用4個標籤搜索了一個art_id,它給了我9的相關性。我不明白它在這個點上的計數是什麼,因爲具有最高相關性的藝術沒有與我比較的藝術相同的標籤。有任何想法嗎?我懷疑它做的次數是多少張藝術照片使用同一個標籤的次數,但不包括它製作的匹配數量。 – Darius

0

既然你正在看一件藝術品是art_id = 1000

SELECT 
    art_info.art_id, 
    art_info.title 
    count(*) as Cnt 
FROM 
    art_tag_relationship A1, 
    art_tag_relationship A2, 
    art_info 
WHERE 
    A1.art_id = 1000 
    AND 
    A1.tag_id = A2.tag_id 
    AND 
    A2.art_id = art_info.art_id 
GROUP BY 
    art_info.art_id 
ORDER BY 
    Cnt DESC 

(未經測試)

從理論上講,它會與所有的藝術,你是看標籤的開始。然後它會展開以匹配其他藝術作品的所有相關標籤。然後,它將根據生成的art_id對其進行分組,並且縮減到每個組中的記錄數應等於匹配的標記數,然後對其進行排序。

玩過這個概念,並更新您的文章,一旦你有一個工作查詢。

+0

使用這個概念。這意味着當一個成員提交一些標籤時,我會運行一個foreach語句來分隔每個單詞,檢查它是否存在於標籤中。如果存在,請使用現有的tag_id鏈接到art_tags_relationship表中,如果該單詞不存在,請將其輸入到art_tags表中? – Darius

+0

此外,它似乎並沒有像我們預期的那樣做,找到標籤然後找到與其匹配的其他標籤。它使它堅持art_id = 1000.所以它只給我art_id 1000的結果,並不會顯示任何其他art_id。 – Darius

+0

-1使用隱式連接。 – Johan