PHP+MySQL自定义博客系统标签使用数统计实现方案
解决方案
核心思路是在查询当前文章关联标签时,同步统计每个标签在全量文章中的关联总数,不需要额外多次查询数据库。
第一步:优化查询SQL,直接返回标签使用计数
你原来的SQL有两个可优化点:一是多余关联了post表,post_tags表已经存了post_id关联关系,不需要再连post表做过滤;二是没有统计标签全局使用量。替换为以下SQL即可:
$stmt = $con->prepare('SELECT tags.id, tags.tag, (SELECT COUNT(DISTINCT post_id) FROM post_tags WHERE post_tags.tag_id = tags.id) AS post_count FROM tags INNER JOIN post_tags ON post_tags.tag_id = tags.id WHERE post_tags.post_id = ?'); $stmt->bind_param('i', $_GET['id']); $stmt->execute(); $tags = $stmt->get_result();
说明:子查询会针对当前返回的每一个标签,自动统计它在post_tags关联表中绑定了多少篇不同的文章,即使存在重复绑定同标签同文章的脏数据,
COUNT(DISTINCT post_id)也能保证计数准确。
第二步:修改前端渲染代码,替换写死的计数
把原来硬编码的1替换为查询结果里的post_count字段即可:
<?php while ($tag = $tags->fetch_assoc()) : ?> <span class="tags"><a href="tags.php?<?= $tag['tag'] ?>" class="tag tag-35762 "><span class="name"><?= $tag['tag'] ?></span><span class="count"><?= $tag['post_count'] ?></span></a> <? endwhile ?>
可选性能优化
从你给出的表结构看,post_tags关联表目前没有给tag_id、post_id建索引,当文章和标签量变大后,关联查询、计数查询都会变慢。可以执行以下SQL加联合索引,查询性能会有明显提升:
ALTER TABLE post_tags ADD UNIQUE INDEX `idx_post_tag` (`post_id`, `tag_id`), ADD INDEX `idx_tag_post` (`tag_id`, `post_id`);
加唯一索引还能从表结构层面避免同一篇文章重复绑定同一个标签的脏数据问题。
内容的提问来源于stack exchange,提问作者josiec09
相关产品推荐
相关产品推荐

