2014-11-05 155 views
8

我有一个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;'); 
+0

num_rows()函数告诉你什么? – 2014-11-05 10:56:15

+0

这是不可能的,一个班轮或格式的SQL造成如此大的差异,你应该检查你的代码。我觉得有些东西在那里。只有你的查询差异是',星形DESC',但我不认为这将使差异 – 2014-11-05 11:10:37

+0

确保你的PHP代码指向相同的数据库,你正在运行此查询 – 2014-11-05 11:15:08

回答

4

是啊。无法保证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, ...; 

但是,评价涉及用户 变量表达式的顺序是不确定的。

+0

这听起来像是问题背后的原因。我尝试了你的修补程序,但它仍然和以前一样,'count'没有增加。您是否知道另一个解决方案,只返回0_lychee_photos与0_lychee_albums结合的最多3行。 – tobi 2014-11-05 14:49:27

+0

@tobi。 。 。你可以在SQL小提琴上举个例子吗? – 2014-11-08 20:23:47

0

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

相关问题