2012-12-24 100 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