GROUP BY HAVING:SQLite与MySQL

时间:2016-02-24 15:29:11

标签: mysql sql sqlite group-by having

由于某些原因,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理解的方式获得想要的结果?

1 个答案:

答案 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中起作用的原因;我不能说。