基于MySQL数据构建PHP排行榜逻辑(含并列排名规则)
基于MySQL+PHP实现带并列规则的排行榜
核心规则回顾
- 积分(Points)越高,排名越靠前
- 积分相同时,获胜次数(wins)越多,排名越高
- 并列排名时显示相同序号,后续排名跳过对应数量的序号(如2个并列第2,则下一个排名为4)
实现步骤
1. MySQL数据查询
先从数据库中按规则取出排序后的用户数据,仅需按points降序、wins降序排序,排名逻辑在PHP中处理:
SELECT username, points, wins FROM users ORDER BY points DESC, wins DESC;
2. PHP排名计算逻辑
遍历查询结果,通过对比当前用户与上一个用户的积分和获胜次数,动态计算排名:
- 初始化
$counter记录遍历位置,$rank记录当前显示的排名 - 若当前用户与上一个用户的积分、获胜次数完全一致,沿用之前的排名
- 若不一致,将
$rank更新为当前计数器值 - 计数器每次遍历都递增,保证排名跳跃的准确性
3. 完整代码示例
<?php // 数据库连接信息 $host = 'localhost'; $dbname = 'your_database'; $username = 'your_username'; $password = 'your_password'; try { // 建立PDO连接 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 查询排序后的用户数据 $stmt = $pdo->query("SELECT username, points, wins FROM users ORDER BY points DESC, wins DESC"); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); // 初始化排名变量 $rank = 1; $counter = 1; $prevPoints = null; $prevWins = null; // 输出排行榜 echo "<table border='1'>"; echo "<tr><th>Rank</th><th>Username</th><th>Points</th><th>Wins</th></tr>"; foreach ($users as $user) { // 判断是否需要更新排名 if ($user['points'] !== $prevPoints || $user['wins'] !== $prevWins) { $rank = $counter; $prevPoints = $user['points']; $prevWins = $user['wins']; } // 输出当前用户行 echo "<tr>"; echo "<td>{$rank}</td>"; echo "<td>{$user['username']}</td>"; echo "<td>{$user['points']}</td>"; echo "<td>{$user['wins']}</td>"; echo "</tr>"; $counter++; } echo "</table>"; } catch(PDOException $e) { die("数据库连接失败: " . $e->getMessage()); } ?>
4. 示例输出
运行代码后,会生成符合要求的排行榜,与题目给出的示例一致:
| Rank | Username | Points | Wins |
|---|---|---|---|
| 1 | User A | 100 | 50 |
| 2 | User B | 96 | 42 |
| 2 | User C | 96 | 42 |
| 4 | User D | 96 | 41 |
| 5 | User E | 96 | 40 |
| 6 | User F | 94 | 42 |
| 6 | User G | 94 | 42 |
| 6 | User H | 94 | 42 |
| 9 | User I | 90 | 40 |
| 10 | User J | 88 | 41 |
内容的提问来源于stack exchange,提问作者Garvin
相关产品推荐
相关产品推荐

