php - MYSQLi 不返回任何行,即使它具有有效的 SQL 和 PHP 语法

标签 php mysql

我的 SQL 代码在 HeidiSQL 中一遍又一遍地运行时有效,但是当我将它克隆到 PHP 中并运行 mysqli_query($db,$sql) 时,它不起作用。

以下 PHP/MySQL 代码均有效且运行良好。

$sql = "select `ID`,`User` from (
            select * from 
                (SELECT 
                    `ID`,
                    `User`,
                    `BI`,
                    (@cnt:= @cnt + (`BI`/(select SUM(`BI`) from `ax`))) as `Entirety`
                from `ax` as `t`
                    CROSS JOIN (SELECT @cnt := 0) AS var
                order by `BI`
            ) d
            where `Entirety`>(@rnd)
            order by `BI`
        ) as `l`
        cross join (select (@rnd := rand()) as `RandomValue`) as var2
        limit 1;";

然后我通过运行 $sql

$result = mysqli_query($db,$sql);
$results = mysqli_fetch_array($result);

其中 $db 是一个有效且开放的 MySQL 服务器连接。但是当我这样做时对象的返回

print_r($result);

结果为

mysqli_result Object ( 
    [current_field] => 0 
    [field_count] => 2 
    [lengths] => 
    [num_rows] => 0 
    [type] => 0
)

我不想要这个并且 num_rows 应该是“1”,因为当我运行 HeidiSQL 时它就是这样显示的。 这是显示结果的 HeidiSQL 图像:

HeidiSQL results

有人有什么想法吗?

ax 表的列是IDUserBI。 在 SQL 中,它创建了两个名为“Entirety”的临时列(概率计数器)和一个名为 RandomValue 的列,这是一个从 0 -> 1 的 rand()。

此表中唯一的一行,值为 (1,1,10)。尽管它是 10,但它的 Entirety 为“1”,这意味着它是 100% 保证被选中的。尽管如此,没有选择任何东西。

最佳答案

如果您在 PHP 查询前加上 EXPLAIN,mysqli 会告诉您一个子查询的错误:

Impossible WHERE noticed after reading const tables

const row not found

这可能意味着很多,但在这种情况下,我的赌注是列中的无效值。我很确定

select (@rnd := rand()) as `RandomValue`

之后执行
where `Entirety`>(@rnd)

因此未设置。

那么,为什么它在您的客户端中有效?因为客户端保持连接。因此,它在您第一次执行查询时失败,但在第二次它具有第一次执行时存储的 @rnd 值。您可以通过在 @rnd1 中重命名 @rnd 并运行一次查询来测试它。

因此,解决方案是(正如 Matt 指出的那样)先设置变量 @rnd,然后再使用它。

这是一个关于子查询中用户定义变量的相关 SO 问题:

User variable in MySQL subquery

来 self 的客户:

第一次解释:

first time execution

第二次解释:

second time

希望这对您有所帮助。

关于php - MYSQLi 不返回任何行,即使它具有有效的 SQL 和 PHP 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27194649/

相关文章:

php - WordPress 不支持 .htaccess

javascript - 社交引擎上的自动完成好友列表无法正常工作

php - 每次刷新mysql时显示来自不同表的数据

mysql - .com.mysql.jdbc.exception.jbbc4.communicationException..通信链路故障

PHP MySQL 查询变量不返回

mysql - 使用MySQL,如何计算Left Join记录的MEDIAN?

php - .htaccess 多 View 在控制 Web 面板服务器中不起作用

php - 当我对 Doctrine 实体进行 json_encode 时,如何使用 getter 方法作为属性?

javascript - 如何等待ajax请求?

mysql - 如何为自动完成功能选择 MySQL 全文索引条目?