运行相同查询时 MySQLi 结果集变化
MySQLi result set chaning when running the same query
有一个相当简单的查询
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,passing/implementing 一个额外的参数 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);
有没有可能 caches/stores 以前的结果(尽管 $query1
和 $query2
完全不同。
避免 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;
有一个相当简单的查询
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,passing/implementing 一个额外的参数 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);
有没有可能 caches/stores 以前的结果(尽管 $query1
和 $query2
完全不同。
避免 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;