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

我有一个包含三个字段的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
我只想在日期如“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%”的行。
      我已更新了我的问题接受此答案并提出另一个问题。