2014-10-09 199 views
0

我不確定這個問題是否已在本網站的其他地方得到解答,但我努力用言語解釋我的問題。 它在這裏: 我想要做的是按照用戶選擇的標籤來訂購crawler_results中的文章。因此,文章中出現的標籤越多(count_tags越大),它的層次結構就越高。我有4個表格:crawler_results(我存儲文章的地方),標籤(我在那裏存儲標籤名稱),article_tags(我存儲tag_id和標籤出現的次數)和user_tags(我存儲user_id和tag_id )。mysql order by tag occurrence group by

我已經試過:

 SELECT cr.id, title, count_tags, t.tag 
     FROM crawler_results cr 
     INNER JOIN article_tags at 
     ON cr.id = at.article_id 
     INNER JOIN tags t 
     ON t.id = at.tag_id 
     INNER JOIN user_tags ut 
     ON ut.tag_id = at.tag_id 
     AND user_id = '$user_id' 
     ORDER BY count_tags DESC 

該查詢顯示由count_tags排序的文章,但不幸的是它與所有的文章包含標籤的這樣做。例如,如果一篇文章是這樣的:「Stackoverflow溢出真棒!」並且用戶選擇「堆棧」和「溢出」作爲標籤,「溢出」應該是查詢看起來唯一的標籤,因爲它看起來比「堆棧」更多。

我有一種感覺,它與GROUP BY有關 - 是嗎?我只是不知道它是如何工作的。

在此先感謝! 如果您需要更多信息,請讓我知道。

編輯: 這裏是我的表:

crawler_results:

 | id   | title  | content  | 
     |:-----------|------------:|:------------:| 
     | 1   | Some title | Some content | 
     | 2   | Other title | Other content| 

標籤:

 | id   | tag   | 
     |:-----------|------------:| 
     | 1   | Some tag | 
     | 2   | Other tag | 

article_tags:

 | id   | tag_id  | article_id | count_tags | 
     |:-----------|------------:|:------------:|:------------:| 
     | 1   | 1   | 1   | 5   | 
     | 2   | 2   | 2   | 10   | 
     | 3   | 1   | 2   | 8   | 

user_tags:

 | id   | user_id  | tag_id  | 
     |:-----------|------------:|:------------:| 
     | 1   | 1   | 1   | 
     | 2   | 1   | 2   | 
+0

請參閱REPLACE和LENGTH – Strawberry 2014-10-09 22:42:46

+0

[SQL函數以獲取字符串在列中出現次數的次數的可能的重複值](http://stackoverflow.com/questions/3031526/sql-function-to-get-count-字符串出現在列中) – Strawberry 2014-10-09 22:44:15

+0

我有文章中標籤的出現次數,現在我只需要通過此次出現來訂購它們:) – 2014-10-10 15:40:19

回答

0

這裏是一個好像又回到了預期的結果查詢:

SELECT cr.id 
    , cr.title 
    , SUM(CASE 
      WHEN ut.tag_id IS NOT NULL THEN at.count_tags 
      ELSE 0 
      END) AS matching_tags 
FROM crawler_results cr 
INNER JOIN article_tags at ON cr.id = at.article_id 
LEFT JOIN user_tags ut ON ut.tag_id = at.tag_id 
         AND user_id = '$user_id' 
GROUP BY cr.id, cr.title 
ORDER BY matching_tags DESC 

我只是爲了計算的每篇文章的標籤數量增加了GROUP BY條款,然後我的結果降序排序。

希望這會有所幫助。

+0

嗨JoëlSalamin!您是否需要將「AND」替換爲「WHERE」以僅獲取用戶選擇的標籤?因爲我測試了你的代碼,它會返回所有的標籤,而不僅僅是用戶選擇的標籤。我試着用WHERE來代替,但那也行不通 - 它返回最低的count_tags而不是最高的。順便說一句,標籤的發生已經被計算,所以不需要COUNT(ut.tag_id),只需:at.count_tags – 2014-10-10 15:38:18

+0

查看編輯的問題:) – 2014-10-10 19:00:54

+0

@MathiasLund感謝您的額外信息。我沒有注意到在你的表中有一個名爲'count_tags'的列,這可能會導致我的ORDER BY子句出現問題......除了這一點,我的查詢似乎是正確的,因爲你是尋找用戶定義的標籤數量,以便對結果進行排序。具有最匹配標籤的文章位於頂部,而沒有對應關係的文章位於結果的底部(我編輯了我的查詢以應用正確的排序條件) – 2014-10-10 19:25:26