【问题标题】:MySQLi result set chaning when running the same query运行相同查询时 MySQLi 结果集发生变化
【发布时间】:2015-01-06 22:21:02
【问题描述】:

有一个相当简单的查询

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);

在这里阅读可能的解决方案about mysqli queries/parameters,可以传递/实现额外的参数MYSQLI_USE_RESULT或使用mysqli_free_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 完全不同。

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

    避免在 SELECT 列中包含不在 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 加上聚合(max、min、count...)中的表达式。 MySQL 允许,但结果有点随机。你能测试我编辑的答案并发布结果吗?
    • 您,先生,成就了我的一天!在处理(排序)相等的值时忘记了“行顺序的随机性”。
    猜你喜欢
    • 2018-04-12
    • 2020-05-15
    • 2015-10-31
    • 1970-01-01
    • 2021-10-27
    • 2013-08-04
    • 2017-12-19
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多