【发布时间】:2017-06-14 14:24:54
【问题描述】:
嘿,我正在尝试从指定的玩家 id 获取排名。
我使用 phpMyAdmin MySQL InnoDB 和 PHP。
我有两个数据库。
Userdatabase 有一个名为 users 的表。 该表有 5 个字段:id、用户名、电子邮件、密码和日期。
第二个数据库称为分数,每个级别都有一个表。 所有表都有相同的字段:id、score、time、bonus、timestamp。
我像这样立即连接到分数数据库:
$conn = mysqli_connect($host, $user, $pass, $mysql_db);
.
$multisql .= "SET @rank := 0;";
$multisql .= "SELECT *, @rank := @rank + 1 AS rank FROM $table AS s
LEFT JOIN userdatabase.users AS u ON s.id = u.id
ORDER BY score DESC, timestamp ASC LIMIT 10;";
此查询返回所有具有正确排名的条目,但我只想要具有 id $userid 的条目,所以我尝试:
$multisql .= "SET @rank := 0;";
$multisql .= "SELECT *, @rank := @rank + 1 AS rank FROM $table AS s
LEFT JOIN userdatabase.users AS u ON s.id = u.id
WHERE u.id = $userid
ORDER BY score DESC, timestamp ASC LIMIT 10;";
这只会返回指定用户的结果,但排名总是1。
我尝试像这样将 Select 包装在另一个 Select 中,但我没有得到这样的结果。
$multisql .= "SET @rank := 0;";
$multisql .= "SELECT * FROM (
SELECT *, @rank := @rank + 1 AS rank FROM $table AS s
LEFT JOIN userdatabase.users AS u ON s.id = u.id
ORDER BY score DESC, timestamp ASC
) rank WHERE id = $userid;";
我已经尝试了上述示例的几种不同变体,但没有任何效果。我很确定应该可以有两个 SELECT 一个接一个。我尝试遵循post 的答案,这与我所追求的很接近。
感谢任何帮助!
【问题讨论】:
-
你在做
SET @rank := 0;然后你在做@rank := @rank + 1你期待什么? -
当我执行
SET @rank := 0;和@rank := @rank +1时,它在第一个示例中工作得很好,我从每个条目中得到了正确的排名。 -
最后一个例子对我有用(尽管为了适应 db 做了一点编辑)
-
这与他们在我最后提到的帖子中所做的相同。 post
-
对不起,误解了您的查询