2012-12-24 64 views
2

我有兩個表,一個調用Tags,另一個調用Posts_Tags作爲多對多的關係。 Posts_Tags包含兩列,分別爲postidtagidTags數據庫還包含一個id列,其對應於聯合表中的tagid按照使用的帖子數來訂購標籤?

我想要得到一個顯示給用戶的標籤名列表,按它們使用的次數排序。利用這些信息,我已經構建了兩個表連接在一起的查詢:

SELECT Tags.name FROM `Tags` LEFT JOIN `Posts_Tags` ON Tags.id = Posts_Tags.tagid 

這讓我的標籤名稱的列表,但很明顯,它不會做的比從剛剛選擇數據純粹得多Tags表。我知道我需要在某處添加一個ORDER BY子句(可能還有一個GROUP BY,但我不知道如何構建查詢。)

我應該向此查詢添加什麼,以便按照每個帖子的數量成功地對結果進行排序標籤中使用?

回答

2

使用Group By要計算的時間用於每個標籤的數量。這是假設你的標籤名稱是獨一無二的,如果不是你要組上的ID來代替。

Select 
    t.Name, 
    Count(*) as TagUse 
From 
    Tags t 
    Left Join 
    Post_Tags p 
    On t.Id = p.TagID 
Group By 
    t.Name 
Order By 
    TagUse Desc 
+2

+1但是FWIW最好給予COUNT(*)別名和ORDER BY別名。 ORDER BY * ordinal *是不推薦的SQL語法。 –

+0

@BillKarwin更新你的建議,謝謝。 – Laurence

2

假設一個標籤只能在帖子上使用一次,您可以這樣做:

SELECT Tags.ID, Tags.name, count(*) as NumPosts 
FROM Tags 
    LEFT JOIN Posts_Tags ON Tags.id = Posts_Tags.tagid 
Group by Tags.ID, Tags.name 
Order by 3 desc