在过去的两天里,我一直在战斗,但没有运气查询我编写的部署审计工具。 在MySQL的早期版本中,我了解到我的旧查询在使用GROUP BY时可能会有一个错误,但我从未注意到。 因此,现在MySQL中的规则已经更改,我正在尝试获得可靠的结果并失败得很严重。
以下是我正在为专栏使用的内容:
|环境 | 应用程序 | 主机名 | 用户 ID | 构建编号 | 时间戳 | 结束时间 | 状态 | 参数 | gitBranch | gulpTest | 哈希 |
哈希是唯一的古怪列,它是介于 1 和 1,000,000 之间的随机整数。 我对主机名和哈希也有唯一的约束。 所有其他列都是时间戳、varchar 或文本列。
我正在尝试从时间戳中获取具有最新部署的单个应用程序名称的结果:
应用程序 1、MAX(时间戳(、与单行匹配的其他列
应用程序 2、MAX(时间戳(、与单行匹配的其他列
我知道我不能使用 GROUP BY,因为我不能对其他列返回说ANY_VALUE,因为这些值将是随机匹配的。 使用 distinct 对我也不起作用,因为当其他列在查询中时,它不限于单个应用程序行返回。
这是旧的查询,可能有我从未注意到的错误:
SELECT gitBranch, hostname, environment, application, timestamp, endTime, userid, state, gulpTest, hash FROM deploy WHERE hostname= :hostname AND hash IN(
select hash from (
select application, hash, timestamp from (
SELECT application, hash, timestamp FROM(
SELECT application , hash, timestamp FROM deploy WHERE hostname= :hostname order by application ,timestamp DESC
) AS derived
) AS derived2 GROUP BY application)
as derived3)
如果有人对如何解决这个问题有建议,我将不胜感激。 我不是DBA,只是在MySQL上闲逛。 我似乎无法弄清楚如何使此查询可靠。
我的一位同事终于怜悯了我和我的挥舞。 这是对我有用的答案。仍然无法很好地理解答案,但它有效。希望它也能帮助其他人。
从"部署 D 左外部联接"中选择 d.* 在 d.application = dd.application 和 d.timestamp