PHP和MySQL使用相同的查询显示不同的结果

PHP和MySQL使用相同的查询显示不同的结果,php,mysql,sql,mysqli,mysql-variables,Php,Mysql,Sql,Mysqli,Mysql Variables,我有一个MySQL查询,直接在本地MySQL数据库上执行时效果很好,但通过PHP执行时会显示不同的结果 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)

我有一个MySQL查询,直接在本地MySQL数据库上执行时效果很好,但通过PHP执行时会显示不同的结果

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] 9n401238 | 0       | 1415091268 | NULL     | 7b832b56f182ad3403521589e2815f67.jpeg | 0     |
| 72 | [Import] 9n401238 | 0       | 1415091268 | NULL     | f058f379ce519f1d8a2ff8c0f5003631.jpeg | 0     |
| 72 | [Import] 9n401238 | 0       | 1415091268 | NULL     | a4d59377bed059e3f60cccf01a69c299.jpeg | 0     |
| 72 | [Import] 9n401238 | 0       | 1415092318 | NULL     | 7b832b56f182ad3403521589e2815f67.jpeg | 0     |
| 72 | [Import] 9n401238 | 0       | 1415092369 | NULL     | cad008943372d984a9b74378874128f8.jpeg | 0     |
| 72 | [Import] 9n401238 | 0       | 1415092369 | NULL     | 84030a64a1f546e223e6a46cbf12910f.jpeg | 0     |
| 73 | Untitled          | 0       | 1415114200 | NULL     | NULL                                  | NULL  |
a)
count
没有像应该的那样增加
b) 由于a)它显示的行数超过了它应该显示的行数(每个id应限制为3行)

我检查了多次,两个查询都完全相同。PHP中没有用户输入或任何差异

我已经查过了,但没有一个能帮上忙。以下查询在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); }

是的。
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
对于其他语句,例如SELECT,您可能会得到您想要的结果 期待,但这不是保证。在下面的声明中,您 可能认为MySQL会先对@a求值,然后再对@a求值 第二项任务:

SELECT @a, @a:=@a+1, ...;
但是,涉及用户的表达式的求值顺序 变量未定义


解决这个问题的一个简单方法是在PHP文档中设置变量mysql。这样地:
$var=mysql\u查询(“SET@nun:=0;”

num_rows()函数告诉您什么?一个行或格式化的sql不可能有这么大的区别,您应该检查代码。我觉得有东西在那儿。您的查询中唯一的区别是
,star DESC
,但我不认为这会造成差异。请确保您的PHP代码指向相同的数据库,您正在运行此数据库Query@RamSharma错误地提出了这个问题(现在更新了)。还是1:1。一行程序,MySQL和PHP中的原始语句。我还尝试使用程序进行比较。@Amal Murali它返回8,因为通过PHP执行时有8行。这听起来像是问题背后的原因。我用你的补丁试过了,但还是和以前一样,
count
没有增加。您是否知道另一种解决方案,从0张荔枝照片和0张荔枝相册中最多只返回3行。@tobi。你能举一个关于SQLFiddle的例子吗?
$database->set_charset('utf8');
$database->query('SET NAMES utf8;');
   (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
SET @a = @a + 1;
SELECT @a, @a:=@a+1, ...;