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

标签 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
");

我错过了什么

最佳答案

您可以通过单独调用相关函数调用将多个命令发送到数据库。例如:

mysql_query('SET @prev_value = NULL') and
mysql_query('SET @rank_count = 0') and
$result = mysql_query('SELECT ...');

由于所有语句都将在同一个数据库 session 中执行,因此 session 变量的值将被保留。

也就是说,可以改写您的查询以避免这种必要性:

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 注入(inject)攻击可能造成的危害,因此应该很少这样做(而且,只有在采取足够的替代预防措施来避免或减轻此类攻击时) .

古老的 ext/mysql 扩展(您正在使用,但在 PHP v5.5 中已被弃用,多年来强烈反对在新代码中使用它)没有官方支持多语句。事实上,documentation明确指出:

Description

resource <strong><em>mysql_query</em></strong> ( string <strong>$query</strong> [, resource <strong>$link_identifier</strong> = NULL ] )

mysql_query() sends a unique query (multiple queries are not supported) to the currently active database on the server that's associated with the specified link_identifier.

但是,此限制仅在驱动程序级别强制执行,can be overridden (以未记录/不受支持的方式)通过设置驱动程序的 CLIENT_MULTI_STATEMENTS 连接标志(或者通过重新编译 PHP 以默认启用这种方式)。这种方法的一个严重缺点是只能访问第一个命令的结果:如果后续命令返回结果(甚至失败),您的应用程序将无法使用此类信息。这显然使这种方法在您的情况下无用,因为您将无法从 SELECT 命令访问结果集。

MySQLi,它是 ext/mysql 的现代替代品,原生 supports multi-statements没有这样的骇客。 PDO,一个更通用的数据库抽象库,也可以支持多语句in some circumstances .您应该切换到使用这两个扩展之一,并且在这样做时,可以使用多语句来实现您想要的目标(尽管出于上述原因,我在这种情况下不鼓励它)。

关于php - 我在哪里将 SET 值放在 mysql 查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23175948/

相关文章:

mysql - 提交到数据库后,输入字段保留空白并带有特殊字符

php - Centos 6.2 - Apache 2 - PHP 5 - 空白结果执行

php - 一步步存储textarea mysql php

php - 在另一个 PHP 页面中将变量从一个表传递到另一个表

javascript - 将 ReactJS 与 PHP 和 Laravel 结合使用

mysql - 投影中属性的顺序是否会影响 SQL 查询的执行速度?

php - Codeigniter mysql 查询特殊字符

php - 如何记录手动付款的发票的概念或方法

MySQL 按字段排序

php - 如何在网站名称上使用 Lettering.js 和 Drupal 7?