我有三个字段的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%'
;
答案 0 :(得分:1)
子查询t2返回具有至少2行的ipaddresses,以及该特定日期的至少一行。 JOIN
与t2&#39结果。
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
根据ANSI SQL date
是保留字,因此您可能需要对其进行分隔。 (背蜱?)
答案 1 :(得分:0)
select host
from table p1
where CAST(p1.date AS DATE) = '2017-12-19'
group by p1.host
having count(distinct p1.ipaddress) >= 2;
你需要:
host
分组,因此当您计算IP地址时,您会获得正确的计数。WHERE
子句,由于日期是日期时间,因此请勿使用通配符。 请注意:您尝试做的事情有问题。条件date like '2011-12-19%'
应如何返回预期结果,例如日期2011-10-18 22:45:16
和2011-12-19 21:56:46
。我觉得你误解了外卡。您不能以这种方式使用通配符,您可以使用日期运算符和条件,因为它是日期时间列。
答案 2 :(得分:0)
尝试类似的东西;
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
进行比较。