我有三个字段的mysql表
host ipaddress date
---- --------- -----
server1.abc.com 10.1.1.1 2011-10-18 22:45:16
server1 10.1.1.1 2011-12-19 21:56:46
server2 11.1.1.1 2011-12-18 21:56:46
server2.abc.com 11.1.1.1 2011-12-17 21:56:46
Here,
host --> varchar
ipaddress --> varchar
date ---> datetime
我想在表格中选择host
,它有ip
的重复条目我只想检查主机的重复条目,如果date like '2011-12-19%'
从上表,我的结果应满足条件date like '2011-12-19%'
host ipaddress date
---- --------- -----
server1.abc.com 10.1.1.1 2011-10-18 22:45:16
server1 10.1.1.1 2011-12-19 21:56:46
我写了以下查询但得到0行
select * from table p1
group by p1.ipaddress having count(*) >= 2
and p1.date like '2017-12-19%'
;
子查询t2返回具有至少2行的ip地址,以及该特定日期的至少一行。 qazxsw poi与t2的结果。
JOIN
根据ANSI SQL,select t1.*
from tablename t1
join (select ipaddress
from tablename
group by ipaddress
having count(*) >= 2
and count(case when CAST(date AS DATE) = '2017-12-19' then 1 end) > 0) t2
on t1.ipaddress = t2.ipaddress
是一个保留字,因此您可能需要对其进行分隔。 (反单引号?)
尝试类似的东西;
date
我强烈建议你,不要把日期字段比作select t1.host from table t1 inner join
(select p1.ipaddress,max(p1.date) as date from table p1
where cast(p1.date as Date) = '2017-12-19'
group by p1.ipaddress
having count(*) > 1) t2
ON t1.ipaddress = t2.ipaddress and t1.date = t2.date
。
like
你需要:
select host
from table p1
where CAST(p1.date AS DATE) = '2017-12-19'
group by p1.host
having count(distinct p1.ipaddress) >= 2;
分组,所以当您计算IP地址时,您将获得正确的计数。host
子句,由于日期是日期时间,因此不要使用通配符。请注意:您尝试执行的操作有问题。如何条件WHERE
应该返回预期的结果,如日期date like '2011-12-19%'
和2011-10-18 22:45:16
。我觉得你误解了外卡。您不能以这种方式使用通配符,您可以使用日期运算符和条件,因为它是日期时间列。
2011-12-19 21:56:46