从另一个条目中选择一个 选择

Posted

技术标签:

【中文标题】从另一个条目中选择一个 选择【英文标题】:Select one entry from another Select 【发布时间】: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 对不起,误解了您的查询 【参考方案1】:

运行实验,使用不同的表和列,但有效地使用最终查询似乎会产生您正在寻找的结果。

首先是显示测试表中所有记录和所有已定义列的基本查询

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       | ***lyn          |
|  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       | ***lyn          |    4 |
|  4 | Betty Boop          | Hollywood         |    5 |
+----+---------------------+-------------------+------+

最后,通过 where 子句施加的额外限制,仅返回一条记录,其排名如上一个查询中所示。

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 时会失败。

【讨论】:

以上是关于从另一个条目中选择一个 选择的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个元素选择中选择属性

mySQL 从另一个选择的列表中选择

插入表格(从另一个表格中选择)和一些参数

从另一个视图中选择 tableview 的行

SwiftUI |从另一个 SwiftUI 视图访问 PickerView 选择

从另一个表中选择查询