【发布时间】:2022-01-20 04:59:40
【问题描述】:
我有一张账单表,其中可以有多个年+月条目,我只需要选择年+月对中的一个。特别是具有最高 id 字段的对,例如表中的最新条目并裁剪出较旧的重复项。
这是一个示例查询和结果,我添加了 month=1 或 2 来限制大小。
SELECT id, year, month, cost_estimate
FROM tblbillforecast
WHERE type = 'E' AND buildingid = 19 AND (month = 1 OR month = 2)
ORDER BY id DESC;
结果:
期望的结果:
SELECT * FROM
(SELECT id,year,month,cost_estimate FROM tblbillforecast WHERE type = 'E' and buildingid=19 and (month=1 or month=2) order by id desc) as b
GROUP BY b.month,b.year
上述查询有效,只是它忽略了应该首先发生的order by id desc。我不确定幕后发生了什么,或者是否有更好的方法来实现这一点,但我被困住了。我已经从其他类似的答案中尝试了 10 多种解决方案,但它们不适用于我的场景。
【问题讨论】:
-
在子查询中应用的 ORDER BY 在外部查询中总是被忽略。如果这个 ORDER BY 没有伴随 LIMIT 那么它没有意义并且可以被移除。
-
您的 GROUP BY 不完整。不属于分组表达式或聚合函数参数的所有列都接收从组的所有现有值中随机选择的不确定值。研究 ONLY_FULL_GROUP_BY。
-
@Akina 如果我添加限制 1 它会限制整个查询,而不仅仅是匹配的年+月。
-
您将结果分组是为了什么?在这里看不到任何聚合,例如 COUNT()、SUM() 等...在我看来,您的问题的框架错误或提供的示例代码错误...