我在哪里将SET值放在mysql查询中

时间:2014-04-19 21:45:57

标签: php mysql

这适用于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
");

我缺少什么

1 个答案:

答案 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在这种情况下劝阻它。)