这适用于PHPmyadmin中的SQL,它为我提供了预期的结果
SET @prev_value = NULL;
SET @rank_count = 0;
SELECT `Name`,`item`, (`totalrate` / `nrrates`), CASE WHEN @prev_value =
(`totalrate` / `nrrates`)
THEN @rank_count WHEN @prev_value := (`totalrate` / `nrrates`) THEN @rank_count :=
@rank_count + 1 END AS `rank` FROM `rtgitems` ORDER BY
(`totalrate` / `nrrates`) DESC
但是在php页面中不起作用,它不会显示任何东西, 当我删除
SET @prev_value = NULL; SET @rank_count = 0; 它显示结果但没有排名
$result = mysql_query("SET @prev_value = NULL;
SET @rank_count = 0;
SELECT `Lpage`,`Limg`,`Name`,`item`, (`totalrate` / `nrrates`), CASE WHEN @prev_value =
(`totalrate` / `nrrates`)
THEN @rank_count WHEN @prev_value := (`totalrate` / `nrrates`) THEN @rank_count :=
@rank_count + 1 END AS `rank` FROM `rtgitems` WHERE item REGEXP 'Total' ORDER BY
(`totalrate` / `nrrates`) DESC
");
我缺少什么
答案 0 :(得分:1)
您可以通过单独调用相关函数调用向数据库发送多个命令。例如:
mysql_query('SET @prev_value = NULL') and
mysql_query('SET @rank_count = 0') and
$result = mysql_query('SELECT ...');
由于语句都将在同一个数据库会话中执行,因此会保留会话变量的值。
那就是说,可以改为重写你的查询以避免这种必要性:
SELECT Name, item,
@rank_count := @rank_count + (totalrate/nrrates < @prev_value) rank,
@prev_value := totalrate/nrrates avg
FROM rtgitems, (SELECT @prev_value := NULL, @rank_count := 0) init
ORDER BY avg DESC
顺便说一句,虽然很少(如果有的话)必要在单个函数调用中向服务器提交多个命令,但可以完成。请注意,启用多语句会增加成功的SQL注入攻击可能造成的伤害,因此很少会这样做(而且,只有在采取了足够的替代预防措施来避免或减轻此类攻击时)
古老的ext/mysql
扩展(您正在使用,但已在PHP v5.5中弃用,并且多年来一直强烈建议不要在新代码中使用它)对多语句没有官方支持。实际上,documentation明确指出:
描述
resource mysql_query ( string $query [, resource $link_identifier = NULL ] )
mysql_query() 向服务器上当前活动的数据库发送一个唯一的查询(不支持多个查询),该服务器与指定的 {{1 }} 强>
但是,此限制仅在驱动程序级别can be overridden(以未记录/不支持的方式)强制执行,方法是设置驱动程序的link_identifier
连接标志(或者通过重新编译PHP以默认启用此类标记) )。这种方法的一个重要缺点是,人们只能访问第一个命令的结果:如果后续命令返回结果(甚至失败),那么这些信息将对您的应用程序不可用。这显然使得这种方法在您的情况下无用,因为您无法从CLIENT_MULTI_STATEMENTS
命令访问结果集。
MySQLi,它是SELECT
的现代替代品,本身supports multi-statements没有这样的hackery。 PDO是一个更通用的数据库抽象库,也可以支持多语句in some circumstances。你应该切换到使用这两个扩展中的一个,这样做,可以使用多语句来达到你想要的目标(虽然由于上面给出的原因,我' d在这种情况下劝阻它。)