gpt4 book ai didi

php - 为什么这个 php 查询不起作用?

转载 作者:行者123 更新时间:2023-11-29 01:55:42 25 4
gpt4 key购买 nike

所以我正在为我的统一游戏制作高分系统,使用 mysql,php。

为了获取存储在数据库中的高分信息,我这样写,(数据库有“score”、“name”列,但没有“rank”列名称)

$sql = "SELECT id, score, name, CASE\n"
. " WHEN @prev_value = score THEN @rank_count\n"
. " WHEN @prev_value := score THEN @rank_count := @rank_count + 1\n"
. "END AS rank\n"
. "FROM BBR\n"
. "ORDER BY score DESC LIMIT $min, $max";

$result = mysql_query($sql) or Die('Query failed: ' . mysql_error());

$info = "";
while($found = mysql_fetch_array($result)){
$info = $info .'@'. $found['name'] .':'. $found['score'] .':'. $found['rank'];
}
echo $info;

并且在统一中,我收到此信息并拆分为每个字符串。

string[] score = serverHighScores[x].Split(':');

但是这个在score[0](name)、score[1](score)上工作的很好,但是在score[2](rank)上就不行了。

为什么?我该如何解决?谢谢。


这个查询是

SET @prev_value = NULL;
SET @rank_count = 0;
SELECT id, score, name, CASE
WHEN @prev_value = score THEN @rank_count
WHEN @prev_value := score THEN @rank_count := @rank_count + 1
END AS rank
FROM BBR
ORDER BY score DESC

这在 phpmyadmin SQL 中运行良好。

最佳答案

我会这样写查询:

SELECT b.id
, b.name
, @rank_cnt := IF(@prev_score = b.score,@rank_cnt,@rank_cnt+1) AS rank
, @prev_score := b.score AS score
FROM BBR b
CROSS
JOIN ( SELECT @rank_cnt := 0, @prev_score := NULL) i
ORDER BY b.score DESC, b.id DESC

注意:不能保证我们通过此查询观察到的行为。 MySQL 引用手册特别警告不要以这种方式使用用户定义的变量。但是我们观察到的行为(至少对于 MySQL 5.1 和 5.5)是一致的。

@prev_score 的赋值在比较之后完成很重要,这就是列在 SELECT 列表中按原样排序的原因。

我不认为 CASE 表达式中的赋值(它在问题查询中的方式)按照我们期望的方式“工作”。我认为这与 MySQL 执行的操作顺序有关。我总是将表达式的结果分配给 SELECT 列表中的用户定义变量,如上所示。

表达式 IF(@prev_score = b.score,@rank_cnt,@rank_cnt+1) 可以替换为等效的 CASE表达式:

  CASE WHEN @prev_score = b.score THEN @rank_cnt ELSE @rank_cnt+1 END

请注意,表达式正在返回一个值,而不是尝试进行赋值。

我更喜欢在语句中初始化用户定义的变量,而不是依赖于单独的 SET 语句。在这种情况下,我们并不真正关心内联 View i 返回的内容,除了我们希望它只返回一行(因为 JOIN 操作)......我们真的更感兴趣的是内联 View 查询在外部查询运行之前被具体化,以便在外部查询运行时初始化变量。

此外,我在 ORDER BY 中添加了另一个表达式,以便结果更具确定性。

...(添加指向 MySQL 引用手册中有关用户定义变量警告的适用部分的链接)


mysql_ 接口(interface)函数已弃用。请改用 mysqliPDO 接口(interface)。

关于php - 为什么这个 php 查询不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29909809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com