针对每个项目的总金额细化您的搜索。 PHP与MYSQL

时间:2009-10-02 13:51:04

标签: php mysql performance

如何在stackoverflow上执行“运行总计”系统的最佳方式,例如标签搜索?例如,如果我点击“php”,它会显示“每个”其他标签上的项目总数,而且非常快。我如何在php中使用mysql执行此操作?

2 个答案:

答案 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更新。