不按预期排序

时间:2019-01-15 08:56:11

标签: mysql sql

我正在使用以下查询:

SELECT plan.datum, plan.anketa, plan.ai as autoinc, plan.objekt as sifra , objekt.sifra, objekt.temp4_da FROM plan 
LEFT JOIN objekt ON plan.objekt = objekt.sifra WHERE objekt.temp4_da = '1'
 AND objekt.sifra >= 30 AND plan.datum > '2019-01-15' and plan.datum < '2019-01-30'
 GROUP BY objekt.sifra
 ORDER BY plan.datum ASC, plan.objekt ASC

我得到了按最后记录排序的结果,尽管我确实按日期对它进行了排序。 enter image description here

结果应该是从2019年1月15日开始,但是您可以看到它的排序日期为plan.datum < '2019-01-30' ...

我该如何实现?

编辑: 当我从2019-01-15到2019-01-20进行选择时,我实现了以下目标: enter image description here

2 个答案:

答案 0 :(得分:1)

您的结果来自MySQL使用GROUP BY处理错误的SQL查询的能力。例如,大多数DBMS无法处理这样的查询

SELECT col1, col2
FROM tab
GROUP BY col1

如果col1tab的主键,则某些DBMS处理该查询,但是,MySQL总是对其进行处理,如果有多个{{,则返回DOMDOM col2值。 1}}个值对应于col2!例如,有表

col1

然后,MySQL可以使用上面显示的SQL查询在星期一返回col1 | col2 ----------- a | 1 a | 2 结果,在星期二返回(a, 1)(我有点讽刺)。

我认为这也是您的情况。 MySQL为每个(a, 2)(查询中的group by属性)随机选择plan.datum,随后您在结果中错过了一些objekt.sifra值。修正查询以获得确定性值,您将摆脱问题。

答案 1 :(得分:0)

鉴于似乎确实按照您希望的前4行进行了排序,这表明这些日期均在指定的范围内。

您只需要进行基本诊断即可: “计划”表是否实际上包含具有这些日期的数据? 如果是这样,那么您的查询将删除数据。

因此,下一个最容易检查的是WHERE,因此删除其他子句(即保留“基准”限制),现在是否显示该数据? 如果仍然没有,那么LEFT JOIN就是问题,因为联接也是过滤器。

如果您执行了这些操作,但出现了数据,则该数据和您对数据的理解不匹配,您需要检查/确认有关您可能已经做过的数据的任何假设。

我不是100%熟悉mysql,但是GROUP BY看起来确实很奇怪,您没有对组进行任何求和,最小值或操作。您需要那条线吗?