mysql - HAVING 不适用于所有版本的 MySQL

标签 mysql having

我有这个查询:

SELECT `j`.`id`, ... (other columns), (6371 * acos( cos( radians( 22.282460 ) ) * cos( radians( j.lat ) ) * cos( radians( j.lng ) - radians( 114.16157 ) ) + sin( radians( 22.282460 ) ) * sin( radians( j.lat ) ) )
) AS `distance`
FROM `job` AS `j`
LEFT JOIN `jobs_tags` AS `jt` ON `jt`.`job_id` = `j`.`id`
LEFT JOIN `tag` AS `t` ON `t`.`id` = `jt`.`tag_id`
LEFT JOIN `user_company` AS `c` ON `c`.`user_id` = `j`.`user_id`
GROUP BY `j`.`id`
HAVING `distance` < 100
ORDER BY `j`.`creation_date` DESC , `distance` ASC
LIMIT 15 

在我的MySQL MAMP (服务器版本:5.5.34)上,它返回我想要的内容:香港(当前的纬度和经度代表香港)周围100公里内的所有工作。

但是,在服务器(服务器版本:5.6.16)的 MySQL 上,SAME 查询返回距离超过 9000 的城市(例如巴黎,距离为 9629.165355675643)。 它为什么忽略 HAVING ?

最佳答案

我不明白为什么你会在服务器之间得到不同的结果。但是,在这种情况下,您不应该使用HAVING。如果您要将条件应用于聚合函数之一的结果,则可以使用 HAVING

HAVING 条件在GROUP BY之后应用,因此 MySQL 必须对所有作业进行分组,而不仅仅是 100 公里以内的作业。通过以下操作,您将获得更好的性能:

SELECT `j`.`id`, ... (other columns), (6371 * acos( cos( radians( 22.282460 ) ) * cos( radians( j.lat ) ) * cos( radians( j.lng ) - radians( 114.16157 ) ) + sin( radians( 22.282460 ) ) * sin( radians( j.lat ) ) )
) AS `distance`
FROM `job` AS `j`
LEFT JOIN `jobs_tags` AS `jt` ON `jt`.`job_id` = `j`.`id`
LEFT JOIN `tag` AS `t` ON `t`.`id` = `jt`.`tag_id`
LEFT JOIN `user_company` AS `c` ON `c`.`user_id` = `j`.`user_id`
WHERE (6371 * acos( cos( radians( 22.282460 ) ) * cos( radians( j.lat ) ) * cos( radians( j.lng ) - radians( 114.16157 ) ) + sin( radians( 22.282460 ) ) * sin( radians( j.lat ) ) )
) < 100
GROUP BY `j`.`id`
ORDER BY `j`.`creation_date` DESC , `distance` ASC
LIMIT 15

通过上述查询,MySQL 将跳过不在 100km 内的作业,这避免了必须加入、对结果进行分组并对无论如何都不会出现在最终结果集中的作业执行聚合函数的额外工作.

如果您没有任何聚合函数,那么不会有性能改进(它们将被同等对待),但无论如何您都不应该使用 HAVING ,因为它是与聚合函数一起使用,并不是为了让您不必重新输入表达式。

关于mysql - HAVING 不适用于所有版本的 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24916113/

相关文章:

mysql - COUNT(*) 返回多行而不是一行

mysql - Drush Drupal 临时文件夹

mysql - Knex.js - 如何使用表达式更新字段

sql - postgresql如何获取重复计数和对应的值

mysql - mysql 的 WHERE 子句中可以使用别名吗?

mysql - Laravel 查询生成器,有问题

mysql - 结果中 5 个可能值中缺少的值的“默认”值

mysql - 选择日期mysql

sql - SQL中HAVING和WHERE有什么区别?

MySQL 别名和字段具有相同的名称 - 在 Having 子句中评估哪个?