【发布时间】:2020-04-17 15:54:34
【问题描述】:
我有两个 MySQL 表 - 设备和校准,其中设备表示设备库存,校准保存每个设备校准的记录。一台设备将进行多次校准。
在 MySQL 5.5 中,以下查询完全可以识别最近校准已过期的设备:
SELECT * FROM equipment AS e
LEFT JOIN (
SELECT calibration_id, equipment_id, calibration_company, certificate_no, date_certified, date_nextdue
FROM (
SELECT calibration_id, equipment_id, calibration_company, certificate_no, date_certified, date_nextdue
FROM calibration
WHERE deleted=0
ORDER BY date_certified DESC
) AS a GROUP BY a.equipment_id
) AS c ON c.equipment_id=e.equipment_id
WHERE e.deleted=0 AND c.date_nextdue <= CURRENT_DATE()
然而,在 MySQL 5.7 中,相同的 SQL 查询有效,但返回的行包括最旧的校准而不是最新的。
我一直在尝试不同的联接,但都需要 GROUP BY 工具,而这似乎是一切都出错的地方。
虽然上面是一个虚构的示例,但我有很多查询在结构上非常相似并且行为方式相同。我的问题分为两部分:
为什么这在 MySQL 5.7 中表现不同,以及
我需要对 SQL 进行哪些更改才能使其在 MySQL 5.7 中按预期运行?
感谢您的帮助。
【问题讨论】:
-
SELECT中有列,GROUP BY中没有。您的查询是 - 并且一直是 - 坏了。我建议您再问一个问题,并提供示例数据、所需结果和逻辑解释,以便您学习如何编写正确的查询来做您想做的事情。 -
你应该阅读手册中的函数依赖。
-
获取一些数据并在启用了 only_full_group 的 dbfiddle 中测试您的查询,在那里您可以看到为什么您的查询不正常。