2015-12-10 115 views
0

我试图从我的数据库中选择所有ips从本月至少一天,多次访问我的网站,但我的sql查询显示错误。我究竟做错了什么?MYSQL查询显示执行错误

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

错误:

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 'GROUP BY ip 

回答

4

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

+0

日期实际上是一个列名 – frosty

+1

@frosty。 。 。我很想念你的评论。 MySQL允许'DATE'作为列名。我可能不会赞成它(因为它也是一个类型和函数名称,所以应该保留,在我看来),但它是允许的。如果'date'存储为一个字符串,那么你需要学习更好的命名约定。它应该存储为日期或称为'datestr'。 –

+0

我想我只是困惑,但我想我现在明白了,重读你的解释之后。 – frosty

2

错误是因为根据mysql文档中有子句必须在group by子句之前没有。

所以,你的查询必须看起来像这样

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

火影忍者!哈哈。为此赞成。 – frosty

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