PHP和MySQL显示不同的结果与相同的查询
我有一个MySQL查询,它直接在我的本地MySQL数据库上执行时工作正常,但通过PHP执行时显示不同的结果。PHP和MySQL显示不同的结果与相同的查询
SELECT a.id, a.title, a.public, a.sysstamp, a.password, t.thumbURL, t.count
FROM 0_lychee_albums AS a
LEFT JOIN (SELECT id, album, thumbURL,
@num := IF(@group = album, @num + 1, 0) AS count,
@group := album AS dummy
from 0_lychee_photos
WHERE album != 0
ORDER BY album, star DESC) AS t ON a.id = t.album
WHERE count <= 2 OR count IS NULL;
或作为一衬垫:
SELECT a.id, a.title, a.public, a.sysstamp, a.password, t.thumbURL, t.count FROM 0_lychee_albums AS a LEFT JOIN (SELECT id, album, thumbURL, @num := IF(@group = album, @num + 1, 0) AS count, @group := album AS dummy FROM 0_lychee_photos WHERE album != 0 ORDER BY album, star DESC) AS t ON a.id = t.album WHERE count <= 2 OR count IS NULL;
其结果是:
| id | title | public | sysstamp | password | thumbURL | count |
| 71 | [Import] 01 | 0 | 1415091268 | NULL | cad008943372d984a9b74378874128f8.jpeg | 0 |
| 72 | [Import] 9n4| 0 | 1415091268 | NULL | 7b832b56f182ad3403521589e2815f67.jpeg | 0 |
| 72 | [Import] 9n4| 0 | 1415091268 | NULL | f058f379ce519f1d8a2ff8c0f5003631.jpeg | 1 |
| 72 | [Import] 9n4| 0 | 1415091268 | NULL | a4d59377bed059e3f60cccf01a69c299.jpeg | 2 |
| 73 | Untitled | 0 | 1415114200 | NULL | NULL | NULL |
PHP的结果:
| id | title | public | sysstamp | password | thumbURL | count |
| 71 | [Import] 01 | 0 | 1415091268 | NULL | cad008943372d984a9b74378874128f8.jpeg | 0 |
| 72 | [Import] 9n4| 0 | 1415091268 | NULL | 7b832b56f182ad3403521589e2815f67.jpeg | 0 |
| 72 | [Import] 9n4| 0 | 1415091268 | NULL | f058f379ce519f1d8a2ff8c0f5003631.jpeg | 0 |
| 72 | [Import] 9n4| 0 | 1415091268 | NULL | a4d59377bed059e3f60cccf01a69c299.jpeg | 0 |
| 72 | [Import] 9n4| 0 | 1415092318 | NULL | 7b832b56f182ad3403521589e2815f67.jpeg | 0 |
| 72 | [Import] 9n4| 0 | 1415092369 | NULL | cad008943372d984a9b74378874128f8.jpeg | 0 |
| 72 | [Import] 9n4| 0 | 1415092369 | NULL | 84030a64a1f546e223e6a46cbf12910f.jpeg | 0 |
| 73 | Untitled | 0 | 1415114200 | NULL | NULL | NULL |
一个)count
不增加像它应该
b)因为a)它显示的行数比它应该多(应该限制为每个ID 3)
我检查过多次,两个查询都完全一样。没有用户输入或PHP中的任何差异。
我已经检查了similar questions,但没有帮助。以下查询在MySQL和PHP上都显示相同的结果:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
是否有人知道这个问题的差异?
编辑与进一步的信息:
$database = new mysqli($host, $user, $password, $database);
$query = "SELECT a.id, a.title, a.public, a.sysstamp, a.password, t.thumbURL, t.count FROM 0_lychee_albums AS a LEFT JOIN (SELECT id, album, thumbURL, @num := IF(@group = album, @num + 1, 0) AS count, @group := album AS dummy FROM 0_lychee_photos WHERE album != 0 ORDER BY album, star DESC) AS t ON a.id = t.album WHERE count <= 2 OR count IS NULL";
$albums = $database->query($query);
while ($album = $albums->fetch_assoc()) { print_r($album); }
我也有和没有执行查询之前,以下试了一下:
$database->set_charset('utf8');
$database->query('SET NAMES utf8;');
是啊。无法保证select
条款中对表达式的评估顺序。因此,变量赋值可能以不同的顺序发生,具体取决于查询的调用方式。
您可以通过将所有变量赋值放入单个表达式来解决此问题。尝试使用此子查询t
:
(SELECT id, album, thumbURL,
(@num := IF(@group = album, @num + 1,
if(@group := album, 0, 0)
)
) as count
FROM 0_lychee_photos CROSS JOIN
(SELECT @num := 0, @group := NULL) vars
WHERE album <> 0
ORDER BY album, star DESC
) t
在documentation的具体解释是:
作为一般规则,比SET语句等,你永远不应该 一个值分配给一个用户变量并读取同一个 声明中的值。例如,为了增加一个变量,这是好的:
SET @a = @a + 1;
对于其他的语句,如SELECT,你可能会得到你 预期的结果,但是这不能保证。在下面的语句,你 可能会认为MySQL将评估@a第一和第二,然后做一个 分配:
SELECT @a, @a:[email protected]+1, ...;
但是,评价涉及用户 变量表达式的顺序是不确定的。
这听起来像是问题背后的原因。我尝试了你的修补程序,但它仍然和以前一样,'count'没有增加。您是否知道另一个解决方案,只返回0_lychee_photos与0_lychee_albums结合的最多3行。 – tobi 2014-11-05 14:49:27
@tobi。 。 。你可以在SQL小提琴上举个例子吗? – 2014-11-08 20:23:47
解决这个问题的一个简单方法是在PHP文档中设置变量mysql。像这样: $ var = mysql_query(“SET @nun:= 0;”);
num_rows()函数告诉你什么? – 2014-11-05 10:56:15
这是不可能的,一个班轮或格式的SQL造成如此大的差异,你应该检查你的代码。我觉得有些东西在那里。只有你的查询差异是',星形DESC',但我不认为这将使差异 – 2014-11-05 11:10:37
确保你的PHP代码指向相同的数据库,你正在运行此查询 – 2014-11-05 11:15:08