Select 一个条目来自另一个 Select
Select one entry from another Select
嘿,我正在尝试从指定的玩家 ID 获取排名。
我使用 phpMyAdmin MySQL InnoDB 和 PHP。
我两个都有数据库。
Userdatabase 有一个 table 称为用户。
table 有 5 个字段:id、用户名、电子邮件、密码和日期。
第二个数据库称为分数,每个级别都有一个 table。
所有 table 都有相同的字段: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;";
此查询 returns 所有具有正确排名的条目,但我只想要 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;";
这个returns只有指定用户的结果,但是排名总是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 的答案进行操作,这与我所追求的很接近。
感谢任何帮助!
运行 一个实验,使用不同的 table 和列,但有效地使用您的最终查询似乎产生了您正在寻找的结果。
首先是基本查询,用于显示测试中的所有记录和所有定义的列table
mysql>select * from `customers`;
+----+---------------------+-------------------+
| id | cust_name | cust_address |
+----+---------------------+-------------------+
| 0 | Charlie Farnsbarnse | Alpha Centauri |
| 1 | Joe Bloggs | Nowhere Important |
| 2 | Fred SMith | Somewhere else |
| 3 | Barney Gumble | Brooklyn |
| 4 | Betty Boop | Hollywood |
+----+---------------------+-------------------+
然后,在设置变量后 运行 一个新查询来显示每个变量的排名。
mysql>set @id=4;
set @rank := 0;
select *, @rank := @rank + 1 as 'rank' from `customers`;
+----+---------------------+-------------------+------+
| id | cust_name | cust_address | rank |
+----+---------------------+-------------------+------+
| 0 | Charlie Farnsbarnse | Alpha Centauri | 1 |
| 1 | Joe Bloggs | Nowhere Important | 2 |
| 2 | Fred SMith | Somewhere else | 3 |
| 3 | Barney Gumble | Brooklyn | 4 |
| 4 | Betty Boop | Hollywood | 5 |
+----+---------------------+-------------------+------+
最后,由于 where 子句 return 施加了额外的限制,所以只有一条记录具有与先前查询中所见排名相同的记录。
mysql>set @rank := 0;
select * from (
select *, @rank := @rank + 1 as 'rank' from `customers` as s
) rank where id = @id;
+----+------------+--------------+------+
| id | cust_name | cust_address | rank |
+----+------------+--------------+------+
| 4 | Betty Boop | Hollywood | 5 |
+----+------------+--------------+------+
这是来自命令行的 运行 但我看不出为什么使用 PHP 变量 $userid
在替换到您的 sql.[=14 时会失败=]
嘿,我正在尝试从指定的玩家 ID 获取排名。
我使用 phpMyAdmin MySQL InnoDB 和 PHP。
我两个都有数据库。
Userdatabase 有一个 table 称为用户。 table 有 5 个字段:id、用户名、电子邮件、密码和日期。
第二个数据库称为分数,每个级别都有一个 table。 所有 table 都有相同的字段: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;";
此查询 returns 所有具有正确排名的条目,但我只想要 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;";
这个returns只有指定用户的结果,但是排名总是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 的答案进行操作,这与我所追求的很接近。
感谢任何帮助!
运行 一个实验,使用不同的 table 和列,但有效地使用您的最终查询似乎产生了您正在寻找的结果。
首先是基本查询,用于显示测试中的所有记录和所有定义的列table
mysql>select * from `customers`;
+----+---------------------+-------------------+
| id | cust_name | cust_address |
+----+---------------------+-------------------+
| 0 | Charlie Farnsbarnse | Alpha Centauri |
| 1 | Joe Bloggs | Nowhere Important |
| 2 | Fred SMith | Somewhere else |
| 3 | Barney Gumble | Brooklyn |
| 4 | Betty Boop | Hollywood |
+----+---------------------+-------------------+
然后,在设置变量后 运行 一个新查询来显示每个变量的排名。
mysql>set @id=4;
set @rank := 0;
select *, @rank := @rank + 1 as 'rank' from `customers`;
+----+---------------------+-------------------+------+
| id | cust_name | cust_address | rank |
+----+---------------------+-------------------+------+
| 0 | Charlie Farnsbarnse | Alpha Centauri | 1 |
| 1 | Joe Bloggs | Nowhere Important | 2 |
| 2 | Fred SMith | Somewhere else | 3 |
| 3 | Barney Gumble | Brooklyn | 4 |
| 4 | Betty Boop | Hollywood | 5 |
+----+---------------------+-------------------+------+
最后,由于 where 子句 return 施加了额外的限制,所以只有一条记录具有与先前查询中所见排名相同的记录。
mysql>set @rank := 0;
select * from (
select *, @rank := @rank + 1 as 'rank' from `customers` as s
) rank where id = @id;
+----+------------+--------------+------+
| id | cust_name | cust_address | rank |
+----+------------+--------------+------+
| 4 | Betty Boop | Hollywood | 5 |
+----+------------+--------------+------+
这是来自命令行的 运行 但我看不出为什么使用 PHP 变量 $userid
在替换到您的 sql.[=14 时会失败=]