php项目统计冲刺跑次数谁更多?

wen PHP项目 1

PHP项目统计冲刺跑次数谁更多?

你这个问题比较简短,我先按最常见的理解来回答:在一个PHP项目中,如何统计"谁冲刺跑次数更多"(比如游戏/运动打卡类应用,记录每个用户的冲刺跑次数并排名)。

php项目统计冲刺跑次数谁更多?

如果你的实际场景不是这个,请补充说明,我再调整。


需求拆解

要统计"谁冲刺跑次数更多",核心是:

  1. 数据表设计:记录每次冲刺跑事件(谁、什么时候、算不算一次冲刺)
  2. 统计查询:按用户聚合计数,排序取最多
  3. 业务判定:什么算"一次冲刺跑"(速度阈值?持续时间?手动打卡?)

数据表设计示例

CREATE TABLE sprint_records (
    id          BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_id     BIGINT UNSIGNED NOT NULL,
    run_at      DATETIME NOT NULL,          -- 冲刺发生时间
    speed       DECIMAL(5,2) DEFAULT NULL,  -- 峰值速度 m/s(若自动判定)
    duration    INT DEFAULT NULL,           -- 持续秒数
    source      TINYINT DEFAULT 1,          -- 1自动识别 2手动打卡
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    KEY idx_user_time (user_id, run_at)
) ENGINE=InnoDB;

统计SQL(谁最多)

总次数排行(Top N)

SELECT
    u.id,
    u.nickname,
    COUNT(s.id) AS sprint_count
FROM users u
JOIN sprint_records s ON s.user_id = u.id
GROUP BY u.id, u.nickname
ORDER BY sprint_count DESC
LIMIT 10;

指定时间范围(如本月)

SELECT
    u.id,
    u.nickname,
    COUNT(*) AS sprint_count
FROM sprint_records s
JOIN users u ON u.id = s.user_id
WHERE s.run_at >= '2025-01-01'
  AND s.run_at <  '2025-02-01'
GROUP BY u.id, u.nickname
ORDER BY sprint_count DESC
LIMIT 10;

并列第一(可能多人次数相同)

SELECT user_id, sprint_count
FROM (
    SELECT user_id, COUNT(*) AS sprint_count
    FROM sprint_records
    GROUP BY user_id
) t
WHERE sprint_count = (SELECT MAX(c) FROM (
    SELECT COUNT(*) c FROM sprint_records GROUP BY user_id
) x);

PHP实现(PDO示例)

<?php
$pdo = new PDO('mysql:host=localhost;dbname=app;charset=utf8mb4', 'root', 'pass', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
function topSprinters(PDO $pdo, string $from, string $to, int $limit = 10): array
{
    $sql = "SELECT u.id, u.nickname, COUNT(*) AS sprint_count
            FROM sprint_records s
            JOIN users u ON u.id = s.user_id
            WHERE s.run_at >= :from AND s.run_at < :to
            GROUP BY u.id, u.nickname
            ORDER BY sprint_count DESC, u.id ASC
            LIMIT :limit";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':from', $from);
    $stmt->bindValue(':to', $to);
    $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
$top = topSprinters($pdo, '2025-01-01', '2025-02-01');
foreach ($top as $i => $row) {
    printf("%d. %s —— %d 次\n", $i + 1, $row['nickname'], $row['sprint_count']);
}

性能优化建议

场景 优化
数据量大 加 (user_id, run_at) 联合索引
频繁查排行 用汇总表 sprint_stats(user_id, stat_date, cnt),每日/每小时增量更新
实时性要求高 Redis ZINCRBY sprint:rank:{period} 1 {user_id},ZREVRANGE 取榜
分页深 用游标(WHERE sprint_count < ?)而非 OFFSET

Redis 方案示例:

$redis->zIncrBy('sprint:rank:2025-01', 1, $userId);
$top = $redis->zRevRange('sprint:rank:2025-01', 0, 9, true); // [userId => count]

"冲刺跑"的判定逻辑(业务层)

如果数据来自 GPS/加速度计,需要先定义规则,

function isSprint(float $peakSpeed, int $durationSec): bool
{
    return $peakSpeed >= 6.0 && $durationSec >= 3; // ≥6 m/s 持续 ≥3 秒
}

然后把符合条件的片段写入 sprint_records,再走上面的统计。


需要你确认的点

  1. "冲刺跑"是自动识别还是用户手动打卡?
  2. 统计口径是总次数、某时间段内,还是平均每天/每周?
  3. 数据量大概多少(决定用 SQL 直查还是 Redis/汇总表)?
  4. 是否需要"并列排名""周榜/月榜/总榜"等多维度?

告诉我这些,我可以给你更贴合的实现方案(含建表、索引、缓存策略和完整PHP代码)。

如果你的问题其实是别的意思(PHP项目里统计谁加班多"之类的比喻),也请直接说明~

上一篇php项目认为主客场因素权重占多少?

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝