MYSQL从表中获取重复值
我有一个包含三个字段的mysql表MYSQL从表中获取重复值,mysql,sql,join,group-by,inner-join,Mysql,Sql,Join,Group By,Inner Join,我有一个包含三个字段的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
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
我只想在日期如“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
从上表中,我的结果应该满足条件日期,如“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%'
;
你需要:
- 按
,以便在计算ip地址时获得正确的计数主机进行分组
- 使用
子句,因为日期是日期时间,所以不要使用通配符WHERE
- 选择“仅主机”
- 如果要选择主机以外的其他列,则需要额外的查询
日期如“2011-12-19%”
应如何返回日期如2011-10-18 22:45:16
和2011-12-19 21:56:46
的预期结果。我认为你误解了外卡。不能以这种方式使用通配符,可以使用dates运算符和条件,因为它是datetime列
- 试试这样的东西
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
我强烈建议您,不要像那样比较日期字段子查询t2返回至少有2行的IPAddress,以及该特定日期的至少一行<代码>将与t2的结果连接起来
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
是一个保留字,因此您可能需要对其进行分隔。(回勾?我得到了0行,但我应该得到2行作为输出不,你应该得到0行,结果集中只有一行的日期'2011-12-19'
,请检查我答案中的最后一个注释。条件日期(如'2011-12-19%')
应如何返回预期结果(如日期2011-10-18 22:45:16
和2011-12-19 21:56:46
日期在不同的月份,甚至没有到该日期的子句)。查询对我来说工作正常。我还想从输出中删除日期为而不是“2011-12-19%”的行。
我已更新了我的问题接受此答案并提出另一个问题。