2011-02-24 63 views
0

我有一個主題畫廊制度。我需要在主題預覽頁面中實現「相關主題」項目。生成SQL查詢來獲取有關結果

每個主題都有顏色和標籤,所以表5間我有:

  • 主題

    • id_theme
    • 標題
  • 顏色

    • id_color
    • 標題(紅色)
  • 標籤

    • id_tag
    • 標題(行星)
  • theme_color

    • id_theme
    • id_color
  • theme_tag

    • id_theme
    • id_tag

美中不足的是,我只收到5分的結果,他們必須展示那些顏色和標籤之間有更多匹配。有了這個要求,我不知道從哪裏開始。有任何想法嗎?

+0

「顏色和標籤之間更多的匹配」是什麼意思比? – Magnus 2011-02-24 14:37:10

+0

這意味着一個「2個標籤和3種顏色」比賽會打一個「0標籤和4種顏色」的比賽,因爲2 + 3> 0 + 4 – andufo 2011-02-25 05:47:21

回答

1

如果你想在五大主題有共同的大多數項目與給定的主題,你可以嘗試這樣的:

DECLARE @target_id_theme INT; 
SET @target_id_theme = 1; -- this is the id_theme you want to find similar themes for 

SELECT t.id_theme, COUNT(*) as matching_things 
FROM theme AS t 
LEFT OUTER JOIN theme_color AS tc ON tc.id_theme = t.id_theme 
LEFT OUTER JOIN theme_tag AS tt ON tt.id_theme = t.id_theme 
WHERE tc.id_color IN (SELECT id_color FROM theme_color WHERE id_theme = @target_id_theme) 
OR tt.id_tag IN (SELECT id_tag FROM theme_tag WHERE id_theme = @target_id_theme) 
GROUP BY t.id_theme 
ORDER BY COUNT(*) DESC 
LIMIT 5 

沒有測試,買家當心,但我希望你明白。這爲每一種顏色或標記,通過計數下降分配給@target_id_theme顏色或標籤,他們的訂單相匹配的行,並給你的前5名

+0

完美工作(有一些小修改嘿嘿)。謝謝你的幫助! – andufo 2011-02-25 12:31:51

0

試試這個:

SELECT * FROM theme t 
    FULL OUTER JOIN theme_color tc ON tc.id_theme = t.id_theme 
    INNER JOIN color c ON c.id_color = tc.id_color 
    FULL OUTER JOIN theme_tag tt ON tt.id_theme = t.id_theme 
    INNER JOIN tag ta ON ta.id_tag = tt.id_tag 
WHERE tag LIKE '%' + @KEYWORD + '%' OR color LIKE '%' + @KEYWORD + '%' OR title LIKE '%' + @KEYWORD + '%' 
+0

您好,感謝您的崗位 - 安德魯的解決方案是這一問題更加一致。標籤/顏色檢查必須通過id進行求和和過濾。 – andufo 2011-02-25 12:33:13