【问题标题】:MYSQL ORDER BY Being Ignored When GROUP BY Applied On Result当 GROUP BY 应用于结果时,MYSQL ORDER BY 被忽略
【发布时间】: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() 等...在我看来,您的问题的框架错误或提供的示例代码错误...

标签: mysql sql


【解决方案1】:

在重新访问了类似问题的已获批准答案后,我找到了一种使其在我的场景中工作并具有可接受的性能的方法:

SELECT m1.*
FROM (SELECT id, year,month,cost_estimate FROM tblbillforecast WHERE type = 'E' and buildingid=19) as m1 LEFT JOIN (SELECT id, year,month,cost_estimate FROM tblbillforecast WHERE type = 'E' and buildingid=19) as m2
 ON (m1.year = m2.year AND m1.month=m2.month AND m1.id < m2.id)
WHERE m2.id IS NULL;

感谢此处批准的答案: Retrieving the last record in each group - MySQL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多