2017-03-06 7 views
0

Ich habe eine Tabelle mit log 'SNMP-Trap-cisco Port':Wie wähle ich den letzten Datensatz mit zwei Parametern aus?

mysql> select id, ip, `index`, trap_date from cisco_trap order by id desc limit 20; 

id  ip   index trap_date   
61110 1582065982  6 2017-03-06 10:27:07 
61109 1582065982  6 2017-03-06 10:21:58 
61108 175141121  45 2017-03-05 22:40:58 
61107 175141121  45 2017-03-05 22:40:52 
61106 175141121  45 2017-03-05 22:39:21 
61105 175141121  45 2017-03-05 22:20:18 
61104 175141121  45 2017-03-05 22:17:56 
61103 175141121  45 2017-03-05 22:17:50 
61102 1582065982  16 2017-03-03 17:00:33 
61101 1582065982  6 2017-03-03 17:00:36 
61100 1582065982  6 2017-03-03 16:42:47 
61099 1582065982  16 2017-03-03 15:29:55 
61098 1582065982  6 2017-03-03 15:30:03 
61097 1582065982  16 2017-03-03 15:27:28 
61096 1582065982  6 2017-03-03 15:27:23 
61095 1582065982  6 2017-03-03 15:26:27 
61094 1582065982  16 2017-03-03 15:26:21 
61093 1582065982  16 2017-03-03 15:25:58 
61092 1582065982  6 2017-03-03 15:25:52 
61091 1582065982  6 2017-03-03 15:23:51 

ip ip in inet_ntoa und index ist die Anzahl der cisco-Port. Wie wählen Sie den letzten Datensatz (Protokoll) an jedem Port (index) jedes ip?

+0

Überprüfen Sie GROUP BY. – jarlh

Antwort

0

Sie können MAX mit GROUP BY verwenden.

SELECT * from cisco_trap 
JOIN (
    select ip, `index`, max(trap_date) as max_date 
    from cisco_trap 
    group by ip, `index` 
) t 
ON t.ip = cisco_trap.ip 
AND t.`index` = cisco_trap.`index` 
AND t.max_date = cisco_trap.trap_date 
+0

Die Abfrage wird sehr langsam ausgeführt ( – Vadym

+0

@ Vadym Abfragegeschwindigkeit hängt von der Anzahl der Datensätze in der Datenbanktabelle ab. Wenn Sie eine 'WHERE'-Klausel hinzufügen und die Abfrage auf eine bestimmte Dauer von 'trap_date' einschränken können, kann dies bei der Beschleunigung helfen die Abfrage. –

0

Es gibt zwei Verfahren, um dies zu erledigen:

  1. Dies ergibt 100% genaues Ergebnis. aber kann langsam werden.

    SELECT id, 
        ip, 
        `index`, 
        trap_date 
    FROM cisco_trap 
    WHERE id IN ( 
          SELECT max(id) 
          FROM cisco_trap 
          GROUP BY ip, index 
         ) 
    ORDER BY id DESC 
    LIMIT 20 
    

2 Wie ich Forschung 100 der Zeit. Leute sagten, dass sie das verwenden, weil es schneller ist als obige Abfrage, aber in meinem Fall gibt diese Abfrage kein genaues Ergebnis. so versuchen Sie 1

SELECT id, ip, `index`, trap_date 
FROM ( 
     SELECT * 
     FROM cisco_trap 
     ORDER BY id DESC , 
       index DESC, 
       id DESC 
    ) 
GROUP BY ip , index 
limit 20; 
Verwandte Themen