分组依据:SQLite 与 MySQL

GROUP BY HAVING: SQLite vs MySQL

出于某种原因 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 的状态为 0)。由于SQLite和MySQL的不同,Rails的生产环境刚好出现这个错误。

MySQL 抛出以下错误:

ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'task_status_updates.status' in 'having clause'

谁能解释为什么上面的语句在 MySQL 中无效,以及如何以 MySQL 理解的方式获得想要的结果?

在没有 SQL 引擎时,此 SQL 会生成任务列表,其中 最后一个 任务状态更新的状态为 0。相反,它会生成 any 任务状态更新状态为 0 的任务列表。

此外,这是对 GROUP BY 的一种非常不规范的使用。 SQlite 和 MySQL happen 都支持在结果集中使用非聚合列,但标准 SQL 不支持。您可能想要的是 DISTINCT 而不是 GROUP BY 但这对您原来的问题没有帮助,即 any status 0 将包含在结果集中,而不仅仅是最新的状态更新.

HAVING 在 MySQL 中不起作用的原因是您的结果集仅包含来自 tasks 的列,结果集中没有 task_status_updates.tasks 字段应用 HAVING 过滤器。真正的问题是为什么它在 SQlite 中有效;我不能说。