【问题标题】:error with sql syntax where havingsql语法错误
【发布时间】:2016-12-13 21:41:38
【问题描述】:

只是想让这个查询工作,但对我来说有点困难..

SELECT
    *, 
  COUNT(*) AS total FROM_UNIXTIME(consume_time,'%Y-%m') AS fecha
FROM
    coupon
HAVING
    fecha = '2016-07'
GROUP BY
    partner_id

【问题讨论】:

  • 错误使用HAVING 也发现语法错误。试试这个:SELECT *, COUNT(*) AS total, DATE_FORMAT(consume_time,'%Y-%m') AS fecha FROM coupon WHERE DATE_FORMAT(consume_time,'%Y-%m') = '2016-07' GROUP BY partner_id``
  • 您遇到任何错误吗?有什么问题?它给出错误?没有返回数据?没有返回正确的数据?
  • 对不起,它在 WHERE 子句中给了我未知的列 fecha
  • 你使用了这个:fecha = '2016-07' 意思是,你告诉你的 mysql 将数据返回到哪里(尽管使用 1000111 是错误的)fecha = '2016-07' 但 fecha 只是一个别名(@987654329 @)。您必须使用表中真正存在的列。

标签: mysql group-by having


【解决方案1】:
  1. 您在选择列表中缺少,,位于AS totalFROM_UNIXTIME 之间。

  2. HAVING 过滤分组集,而WHERE 在分组之前过滤记录——在这种情况下,您需要后者,但是在评估 WHERE 子句时,像 fecha 这样的别名不可用。因此,您需要在 WHERE 子句中重复底层表达式:

    WHERE FROM_UNIXTIME(consume_time,'%Y-%m') = '2016-07'
    

    但是,这种方法不是 sargable - 最好将您的文字转换为可以直接过滤 consume_time 的范围(特别是如果表上有索引):

    WHERE consume_time >= UNIX_TIMESTAMP('2016-07-01')
      AND consume_time <  UNIX_TIMESTAMP('2016-08-01')
    

    最好将consume_time 存储为 MySQL 理解的时间数据类型,例如TIMESTAMP(恰好在内部存储为 Unix 时间戳),而不仅仅是一个整数——那么你就可以完全取消转换函数:

    WHERE consume_time >= '2016-07-01'
      AND consume_time <  '2016-08-01'
    
  3. 由于您是按partner_id 分组的,因此在功能上不依赖于它的任何结果集列中的值将是不确定的。这可能不是你想要的。您真的是要选择除按partner_id 分组的所有列吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 2015-03-22
    • 2015-04-04
    相关资源
    最近更新 更多