【问题标题】:same query with order clause, same dataset, but different result具有 order 子句的相同查询,相同数据集,但结果不同
【发布时间】:2018-03-02 23:52:30
【问题描述】:

我正在通过编写一个测试器来测试我的应用程序(一个 ERP 系统),该测试器将执行 30 步这样的固定场景

//pseudo code(PHP)
public function runScenario1Test(){
    V2_1Tester::resetDatabase();
    V2_1Tester::insert60Companies();
    V2_1Tester::insert2000Items();
    V2_1Tester::insert100Purchases();
    V2_1Tester::insert100Sales();

    //do some other stuff

    V2_1Tester:checkResults();
}

虽然每次我运行相同代码、相同数据、所有输入都相同的测试时,我有时会得到不同的结果!!!

我的头要炸了,经过 4 天的调查、眼泪,甚至是晚上做数据库梦,结果发现这个 bug 是在一个有时返回不同结果的查询中。是这样的

+-----+--------------+-----------+------+--------+
| ID  |     date     | direction | col3 |  col4  |
+-----+--------------+-----------+------+--------+
|  1  |  2018-03-03  |     in    |   6  | 100.50 |
|  2  |  2018-03-03  |     in    |   6  | 350.75 |
+-----+--------------+-----------+------+--------+
-- more ~ 3000 rows

$query = "SELECT * FROM table ORDER BY date, direction, col3";

此查询有时返回 1 然后 2,有时返回 2 然后 1。

我通过添加额外的订购级别来修复查询ID

$query = "SELECT * FROM table ORDER BY date, direction, col3, ID";

但我不明白为什么 MySQL 会这样?,换句话说 对于所有 order-by 列都相同的行,MySQL 将遵循什么规则?以及为什么会发生变化?

【问题讨论】:

    标签: mysql sql sql-order-by


    【解决方案1】:

    在 SQL 中,order by 不稳定。这意味着当键相同时,排序可以是任何顺序。

    这实际上是显而易见的。 SQL 表代表 无序 集合。除非列指定排序,否则没有排序。

    所以,您通过将id 包含为最后一个键做了正确的事情。这可确保订单明确定义,因为没有重复的键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-25
      • 2021-10-27
      • 2014-07-06
      • 2013-07-15
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多