由于某些原因,MySQL不接受以下查询:
SELECT `tasks`.* FROM `tasks` INNER JOIN `task_status_updates` ON `task_status_updates`.`task_id` = `tasks`.`id` GROUP BY task_status_updates.task_id HAVING `task_status_updates`.`status` = 0
然而,在SQLite中运行完全相同的查询会产生预期的结果(最后tasks
具有状态task_status_update
的{{1}}列表)。这个错误恰好发生在Rails的生产环境中,因为SQLite和MySQL存在差异。
MySQL抛出以下错误:
0
有人可以解释为什么上述语句在MySQL中无效,以及如何以MySQL理解的方式获得想要的结果?
答案 0 :(得分:1)
在没有SQL引擎的情况下,此SQL将生成最后任务状态更新的状态为0的任务列表。相反,它将生成 any 的任务列表任务状态更新的状态为0。
此外,这是GROUP BY的极其非标准用法。 SQlite和MySQL 都发生以支持在结果集中使用非聚合列,但标准SQL不支持。希望您可能想要的是DISTINCT而不是GROUP BY,但这不会帮助您解决原始问题,即任何状态0将包含在结果集中,而不仅仅是最新的状态更新。
HAVING在MySQL中不起作用的原因是你的结果集只包含来自tasks
的列,结果集中没有task_status_updates.tasks
字段用于应用HAVING过滤器。真正的问题是它在SQlite中起作用的原因;我不能说。