Php MySQLi结果集在运行同一查询时发生更改

Php MySQLi结果集在运行同一查询时发生更改,php,mysql,mysqli,Php,Mysql,Mysqli,有一个相当简单的查询 SELECT af_ad.*, af_ad_to_interest.interest_id FROM af_ad LEFT JOIN af_adlike ON af_adlike.ad_id = af_ad.ad_id LEFT JOIN af_ad_to_interest ON af_ad_to_interest.ad_id = af_ad.ad_id LEFT JOIN af_ad_stats ON af_ad_stats.ad_id = af_ad.ad_id

有一个相当简单的查询

SELECT
    af_ad.*, af_ad_to_interest.interest_id
FROM af_ad
LEFT JOIN af_adlike ON af_adlike.ad_id = af_ad.ad_id
LEFT JOIN af_ad_to_interest ON af_ad_to_interest.ad_id = af_ad.ad_id
LEFT JOIN af_ad_stats ON af_ad_stats.ad_id = af_ad.ad_id
WHERE
    (af_adlike.user_id = 1 AND af_adlike.adlike_action = 1)
    AND af_ad.ad_deleted = 0 AND af_ad.ad_accepted = 1
GROUP BY af_ad.ad_id, af_ad_to_interest.interest_id
ORDER BY af_ad.ad_date_created DESC, af_ad.ad_id
结果集在大多数运行(查询执行)中保持不变,但在某些情况下结果集碰巧改变了行顺序(手动测试,结果集相对较小,约2000行,发生第5次)

相应的PHP代码如下所示

$handle = new mysqli($db_host, $db_user, $db_password, $db_name);
$result = $handle->query($query);
阅读此处可能的解决方案,传递/实现额外参数
MYSQLI\u USE\u RESULT
或使用
MYSQLI\u free\u RESULT
、关闭连接等是否可以解决此问题

编辑1:

以下是输出阵列:

大多数情况下:

[0] => 15
[1] => 19
**[2] => 10**
[3] => 17
[4] => 12
[5] => 9
[6] => 16
[7] => 18
[8] => 9
[9] => 9
[10] => 12
[11] => 10
[12] => 11
[13] => 11
[14] => 18
[15] => 2
[16] => 20
有些情况:

[0] => 15
[1] => 19
[2] => 17
[3] => 12
[4] => 9
[5] => 16
**[6] => 10**
[7] => 18
[8] => 9
[9] => 9
[10] => 12
[11] => 10
[12] => 11
[13] => 11
[14] => 18
[15] => 2
[16] => 20
编辑2:

发现了另一个可能的陷阱。我按顺序运行两个查询,如

$result1 = $handle->query($query1);
$result2 = $handle->query($query2);

它是否可能以某种方式缓存/存储以前的结果(尽管
$query1
$query2
有很大的不同。

避免在选择的列中包含不在GROUP BY中的列:

SELECT
    af_ad.ad_id, af_ad_to_interest.interest_id, min(af_ad.ad_date_created) as min_ad_date_created
FROM af_ad
LEFT JOIN af_adlike ON af_adlike.ad_id = af_ad.ad_id
LEFT JOIN af_ad_to_interest ON af_ad_to_interest.ad_id = af_ad.ad_id
LEFT JOIN af_ad_stats ON af_ad_stats.ad_id = af_ad.ad_id
WHERE
    (af_adlike.user_id = 1 AND af_adlike.adlike_action = 1)
    AND af_ad.ad_deleted = 0 AND af_ad.ad_accepted = 1
GROUP BY af_ad.ad_id, af_ad_to_interest.interest_id
ORDER BY min_ad_date_created DESC, af_ad.ad_id;

使用您的解决方案编辑了我的问题。尽管指出了另一个可能的问题,但仍然得到相同的结果。实际上,如果您已获得GROUP BY,则SELECT和ORDER BY都不能具有GROUP BY plus聚合中的表达式(最大、最小、计数…).MySQL不允许这样做,但结果有点随机。你能测试我编辑的答案并发布结果吗?先生,你让我很开心!忘记了在处理(排序)相等值时的“行顺序随机性”。