像在stackoverflow上搜索标签这样的“总运行”系统最好的方法是什么?例如,如果我点击'php‘,它会显示'each’其他标签上的项目总数,而且速度非常快。我如何用mysql在php中做到这一点?
发布于 2009-10-02 13:58:45
这是一个“看起来”像这样的查询
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_Id)与标签(或者更有可能是TagId,因为标签应该是规范化的,但这是一个细节)关联的Post_Tags。对于给定的帖子,Post_Tags中的记录数量与贴有不同标签的帖子一样多。
注意:实际上,SO Posts数据库的结构更加复杂,有不同的表用于存储评论、回复等,但是对于Post- to -Tag关系,这种两表布局(或者更像是允许在Post_Tags中有一个tagId而不是标签本身的3表布局)捕捉到了它是如何可能的、容易和快速的(如果提供了正确的索引)来显示这些过滤的聚集计数的本质。
这个想法是找到与目标标签(这里是'PHP')相关联的所有PostID(在“T1”中查找),然后按标签聚合所有帖子(在“T2”中)。
注意,主表SO_Posts在这里不是必需的,但它可能是查询的一部分,例如,允许添加额外的条件,例如帖子状态(未关闭...)。
发布于 2009-10-02 13:51:46
我可以想象他们只是使用了一个简单的select count(*) from questions where tag = $tagname,即缓存在memcached中的。 (<-重要的部分)
正如一位评论者所说,他们也可能只是在一个单独的表中跟踪标签计数。但你不能真正确定--我们真正能做的就是猜测。它确实可以工作,但关键是你应该对你的应用程序进行基准测试,看看哪种方法更适合你。就我们所知,标签计数不是实时的,并且由表中的cron或其他东西每小时更新一次。
https://stackoverflow.com/questions/1509625
复制相似问题