MYSQL从表中获取重复值

时间:2017-12-22 07:28:45

标签: 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
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%' 
;

3 个答案:

答案 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子句,由于日期是日期时间,因此请勿使用通配符。
  • 仅限SELECT主机。
  • 如果您想选择除主机以外的其他列,则需要额外的查询。

请注意:您尝试做的事情有问题。条件date like '2011-12-19%'应如何返回预期结果,例如日期2011-10-18 22:45:162011-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进行比较。