实现收藏排行需先设计favorites表(含user_id、item_id、item_type等字段),再通过GROUP BY COUNT统计并按次数降序排列;可关联主表补充信息,加时间/状态等条件筛选,并用复合索引或预计算优化性能。

要实现收藏排行,核心是统计每个内容被收藏的次数,再按次数降序排列。MySQL 本身不提供“收藏”表结构,所以需要先有合理的数据表设计,再通过聚合查询拿到排行结果。
典型场景中,收藏行为通常涉及两个主体:用户(user)和被收藏的内容(如文章、商品、视频等)。推荐使用一张独立的收藏关系表,例如:
假设你要查“所有文章”的收藏数排行(item_type = 'article'),直接用 GROUP BY + COUNT 即可:
SELECT item_id AS article_id, COUNT(*) AS favorite_count FROM favorites WHERE item_type = 'article' GROUP BY item_id ORDER BY favorite_count DESC LIMIT 10;
这条语句返回收藏数最高的前10篇文章ID及对应次数。如果还需展示文章标题等信息,可 LEFT JOIN 文章主表(如 articles):
SELECT a.id, a.title, COUNT(f.item_id) AS favorite_count FROM articles a LEFT JOIN favorites f ON f.item_id = a.id AND f.item_type = 'article' GROUP BY a.id, a.title ORDER BY favorite_count DESC LIMIT 10;
实际业务中常需限定时间范围(如“近7天收藏榜”)或排除无效用户(如封禁用户、测试账号):
AND f.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
AND f.user_id NOT IN (1001, 1002) 或关联用户状态表过滤示例(7天内活跃用户的收藏排行):
SELECT f.item_id, COUNT(*) AS favorite_count FROM favorites f INNER JOIN users u ON f.user_id = u.id WHERE f.item_type = 'article' AND f.is_active = 1 AND u.status = 'active' AND f.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY f.item_id ORDER BY favorite_count DESC LIMIT 10;
当收藏量达百万级后,单纯 GROUP BY 可能变慢。可考虑:
不复杂但容易忽略的是:确保 WHERE 条件中的字段都有索引支撑,否则 COUNT + GROUP BY 会触发全表扫描。
以上就是如何使用mysql实现收藏排行_mysql收藏排行查询实战的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号