如何在stackoverflow上执行“运行总计”系统的最佳方式,例如标签搜索?例如,如果我点击“php”,它会显示“每个”其他标签上的项目总数,而且非常快。我如何在php中使用mysql执行此操作?
答案 0 :(得分:3)
这是一个“看起来”像
的查询SELECT T2.Tag, COUNT(*)
FROM SO_Posts P1
JOIN Post_Tags T1 ON P.PostId = T1.PostId
JOIN Post_Tags T2 ON P.PostId = T2.PostId
GROUP BY T2.Tag
WHERE T1.Tag = 'PHP'
ORDER BY COUNT(*) DESC
这个查询做出了合理的假设,即关于SO的帖子(问题)存储在两个表中;
SO_Posts ,每个帖子包含一条记录,并保存信息,例如PostId(主键),问题本身,日期,标题等。
和
Post_Tags 将给定帖子(通过其Post_Id)与标签相关联(或者更可能是TagId,因为标签应该被标准化,但这是一个细节)。对于给定的帖子, Post_Tags 中有多少记录,因为帖子上附有不同的标签。
注意:实际上SO Posts数据库的结构更复杂,有各种表用于存储注释,回复等,但是关于Post-to-Tag关系,这种两表布局(或者更可能是3表布局)允许在 Post_Tags 中使用tagId而不是标签本身)捕获了如何实现,简单快速(提供正确的索引)以显示这些过滤的agregate计数强>
想法是找到与目标标签相关的所有PostID(此处为“PHP”)(在“T1”中查找),然后按标签聚合所有帖子(在“T2”中)。
请注意,这里不需要主表SO_Posts,但它可能是查询的一部分,例如允许添加额外的条件,例如发布状态(未关闭...)。
答案 1 :(得分:0)
我想他们只是使用了一个简单的select count(*) from questions where tag = $tagname
缓存在memcached中。(< - 重要部分)
正如评论者所说,他们也可以在一个单独的表中跟踪标签计数。但你无法确定 - 我们所能做的就是猜测。它确实有用,但关键是你应该对你的应用程序进行基准测试,看看哪种方法更适合你。我们知道标签计数不是实时的,并且每小时都会被表格中的一个cron更新。