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

Posted

技术标签:

【中文标题】PHP 和 MySQL 使用相同的查询显示不同的结果【英文标题】:PHP and MySQL showing different results with same query 【发布时间】:2015-01-01 12:44:45 【问题描述】:

我有一个 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;

或作为单行:

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 | 1     |
| 72 | [Import] 9n401238 | 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] 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 中没有用户输入或任何差异。

我已经检查过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;');

【问题讨论】:

num_rows() 函数告诉你什么? 一个衬里或格式化的 sql 不可能有这么大的不同,你应该检查你的代码。我觉得有什么东西在那里。您查询的唯一区别是, star DESC,但我认为这不会有所不同 确保您的 PHP 代码指向您正在运行此查询的同一个数据库 @Ram Sharma Mistake 通过创建此问题(现已更新)。 1:1 一样。既是一个班轮,也是 MySQL 和 PHP 中的原始语句。我还尝试使用程序进行比较。 @Amal Murali 它返回 8,因为通过 PHP 执行时有 8 行。 【参考方案1】:

是的。不保证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:=@a+1, ...;

但是,涉及用户的表达式的计算顺序 变量未定义。

【讨论】:

这听起来像是问题背后的原因。我用你的修复方法试过了,但它仍然像以前一样,count 没有增加。您是否知道另一种解决方案,仅从 0_lychee_photos 与 0_lychee_albums 返回最多 3 行。 @tobi 。 . .你能举个关于 SQL Fiddle 的例子吗?【参考方案2】:

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

【讨论】:

以上是关于PHP 和 MySQL 使用相同的查询显示不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

PHP MySQL查询在结果中显示错误的日期时间

php mysql替代在循环中再次使用相同的查询[重复]

在mysql中以不同月份显示相同数据(或值)两次的查询

逐步查询 MySQL 数据库 - 最佳方法?

相同的查询在重复执行时返回不同的值

用PHP+mysql查询两个表,然后怎么样把已经查出来的两个数组合并在一起,两张表里有一个相同的字段