我的 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 图像:
有人有什么想法吗?
ax
表的列是ID
、User
和BI
。
在 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 的客户:
第一次解释:
第二次解释:
希望这对您有所帮助。
关于php - MYSQLi 不返回任何行,即使它具有有效的 SQL 和 PHP 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27194649/