我正在使用以下查询:
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
我得到了按最后记录排序的结果,尽管我确实按日期对它进行了排序。
结果应该是从2019年1月15日开始,但是您可以看到它的排序日期为plan.datum < '2019-01-30'
...
我该如何实现?
答案 0 :(得分:1)
您的结果来自MySQL使用GROUP BY
处理错误的SQL查询的能力。例如,大多数DBMS无法处理这样的查询
SELECT col1, col2
FROM tab
GROUP BY col1
如果col1
是tab
的主键,则某些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
看起来确实很奇怪,您没有对组进行任何求和,最小值或操作。您需要那条线吗?