【问题标题】:MySQL query with less than or greater than in the where statement using aggregate function?MySQL查询小于或大于使用聚合函数的where语句?
【发布时间】:2015-10-26 00:45:57
【问题描述】:

我有一个 MySQL 查询,它非常简单,但有一个问题,想知道是否有人可以解释一下。我要做的就是包含两个聚合函数,它们同时添加“今年”+“去年”,过滤掉任何少于 200 个总投票的结果

目前,查询有效,输出如下所示:

name   | total_votes
--------------------
apple  |    119
lemon  |    218
orange |    201
pear   |    111

但是,当我添加 where 语句时,出现语法错误:

 select 
        name,
        sum(this_year)+sum(last_year) as total_votes
        from fruit_sales
        group by name
        where total_votes>200

上面的结果在我的 SQL fiddle 中出现了这个语法错误:

"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where total>200' at line 6"

我也试过了:

select 
name,
sum(this_year)+sum(last_year)>200 as total_votes
from fruit_sales
group by name

这是一个 SQLfiddle,其中包含表格和我的查询:

http://sqlfiddle.com/#!9/a6862/11

这里的任何帮助将不胜感激!

【问题讨论】:

标签: mysql sql


【解决方案1】:
SELECT
    name,
    SUM(this_year)+SUM(last_year) as total_votes
 FROM fruit_sales
 GROUP BY name
 HAVING SUM(this_year)+SUM(last_year) > 200

SqlFiddleDemo

你也可以这样计算总和:

SELECT
    name,
    SUM(this_year + last_year) as total_votes
FROM fruit_sales
GROUP BY name
HAVING total_votes > 200;

SqlFiddleDemo2

对于没有HAVING 并使用子查询的@lcm

SELECT *
FROM (
SELECT
    name,
    SUM(this_year + last_year) as total_votes
 FROM fruit_sales
 GROUP BY name) AS sub
WHERE total_votes > 200;

SqlFiddleDemo3

【讨论】:

  • 为什么要重新计算?
  • 有没有办法在不使用 HAVING 的情况下做到这一点?
  • 如果您想在 where 中执行此操作而无需再次进行计算。拥有可以引用表别名,因此无需在此处执行此操作
  • @JohnRuddell 为什么要重新计算?我来自 SQL Server 世界。在那里你不能在 HAVING 中使用别名,所以我只是以我自然的方式。可能在 MySQL 中它的行为不同,并且会再次计算它(如果是这样,那么 MySQL 中的查询优化器真的很弱)。无论如何,感谢您的反对。
【解决方案2】:

您也可以使用选择中的 feldname

select 
name,
sum(this_year)+sum(last_year) as total_votes
from fruit_sales

group by name
having total_votes>200;

【讨论】:

    【解决方案3】:

    在您的第一个查询中,您尝试引用两个值:total_votestotal。确保您引用了正确的值以使查询起作用

    【讨论】:

    • 无法在 where 中引用别名
    • 谢谢@JohnRuddell!
    • 感谢您对我的错误的说明...我进行了编辑以将 total 更改为 total_votes。
    • 这并没有解决它.. 该操作试图说明 where total_votes >200 这是无效的,因为无法在 where 调用 total_votes
    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多