【问题标题】:How to use GROUP BY together with HAVING?如何将 GROUP BY 与 HAVING 一起使用?
【发布时间】:2016-03-15 14:15:34
【问题描述】:

我试图从我的数据库中选择所有访问过我网站的 ip,从本月开始,至少相隔一天,但我的 sql 查询显示错误。我做错了什么?

SELECT ip,COUNT(ip) AS matches
FROM ipAll
WHERE DATE LIKE  '%-12-%'
HAVING matches > '1'
GROUP BY ip

错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'GROUP BY ip

附近使用的正确语法

【问题讨论】:

    标签: mysql database group-by


    【解决方案1】:

    HAVINGGROUP BY 之后:

    SELECT ip, COUNT(ip) AS matches
    FROM ipAll
    WHERE DATE LIKE  '%-12-%'
    GROUP BY ip
    HAVING matches > 1;
    

    但是,您应该像这样编写查询:

    SELECT ip, COUNT(ip) AS matches
    FROM ipAll
    WHERE MONTH(DATE) = 12
    GROUP BY ip
    HAVING matches > 1;
    

    不要在日期上使用LIKE,因为日期会使用本地国际化设置(隐式)转换为字符串。这些可能会改变并破坏代码。另外,不要在需要数字的地方使用字符串常量。

    【讨论】:

    • 日期其实是一个列名
    • @frosty 。 . .我想念你评论的重点。 MySQL 允许 DATE 作为列名。我可能不赞成它(因为它也是一个类型和函数名,所以我认为应该保留它),但它是允许的。如果date 存储为字符串,那么您需要学习更好的命名约定。它应该存储为日期或称为datestr
    • 我想我只是糊涂了,但我想我现在明白了,在重读你的解释之后。
    【解决方案2】:

    错误是因为根据mysql文档,有子句必须在group by子句之后而不是之前。

    所以您的查询必须如下所示

    SELECT ip,COUNT(ip) AS matches FROM ipAll WHERE DATE LIKE  '%-12-%' GROUP BY ip HAVING matches > '1'
    

    【讨论】:

      【解决方案3】:
      SELECT ip, COUNT(ip) AS matches
      FROM ipAll
      WHERE DATE LIKE  '%-12-%'
      GROUP BY ip
      HAVING matches > 1;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-22
        • 2017-10-11
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多