[gelöst]MySQL: Benötige Hilfe bei Erstellung einer Query (DbLog)

Begonnen von GaiusMarius, 16 November 2020, 17:04:49

Vorheriges Thema - Nächstes Thema

GaiusMarius

Hallo allerseits,

durch eine Panne meinerseits  ::) bei der Umbenennung des DbLog-Devices habe ich doppelte Einträge von zwei verschiedenen DbLog-Devices mit gleichem `TIMESTAMP` in der DB.

Die Tabelle sieht dann so aus (Auszug):
+---------------------+-------------+-------+------------------------------------+----------------------------+--------+------+
| TIMESTAMP           | DEVICE      | TYPE  | EVENT                              | READING                    | VALUE  | UNIT |
+---------------------+-------------+-------+------------------------------------+----------------------------+--------+------+
| 2020-11-13 19:26:02 | DatabaseLog | DBLOG | CacheUsage: 2                      | CacheUsage                 | 2      |      |
| 2020-11-13 19:26:02 | DatabaseLog | DBLOG | background_processing_time: 0.0152 | background_processing_time | 0.0152 |      |
| 2020-11-13 19:26:02 | DatabaseLog | DBLOG | sql_processing_time: 0.0042        | sql_processing_time        | 0.0042 |      |
| 2020-11-13 19:26:02 | DbLog       | DBLOG | CacheUsage: 145                    | CacheUsage                 | 145    |      |
+---------------------+-------------+-------+------------------------------------+----------------------------+--------+------+


Früher hieß das Device "DatabaseLog", aktuell "DbLog". In der Übergangszeit gab es leider beide.

Und weil es beide gleichzeitig gab, funktioniert die einfache Umbenennung1) 'set DbRep_Agent <deviceRename> DatabaseLog,DbLog' nicht. Die Fehlermeldung "DBD::mysql::st execute failed: Duplicate entry '2020-11-13 19:26:02-DbLog-CacheUsage' for key 'PRIMARY' at ./FHEM/93_DbRep.pm line 4847." ist nur logisch!

Also dachte ich mir, dass ich einfach eine Query baue, bei der
alle Zeilen gelöscht werden
  • in denen das Attribut `DEVICE` den Wert "DatabaseLog" hat
  • und es eine andere Zeile gibt, in der
    • das Attribut `DEVICE` den Wert "DbLog" hat
    • und das Attribut `TIMESTAMP` denselben Wert wie in der zu löschenden Zeile hat
    • und das Attribut `READING` denselben Wert wie in der zu löschenden Zeile hat.
Hier in dem Beispiel soll dann genau (und nur) die erste Zeile gelöscht werden.

Meine Schwierigkeit nun: Ich habe keine Ahnung, wie ich so eine Anweisung in SQL formuliere!  :(
Mehr als die Grundzüge SELECT `irgendwas` FROM `irgendwo` WHERE `irgendwas anderes` = "irgendein Wert"; bekomme ich alleine nicht hin.
Gerne nehme ich auch andere Ideen, wie ich meine Daten bereinigen kann.


Anmerkungen:
  • Es gibt noch diverse andere `DEVICE` mit diversen anderen Namen; diese sind aber nicht betroffen.
  • Es gibt noch diverse andere `READING` sowohl bei den diversen anderen `DEVICE` als auch bei den betroffenen "DatabaseLog" und "DbLog". Zwar sind "CacheUsage", "background_processing_time" und "sql_processing_time" reale Werte, aber letztendlich nur Beispiele für andere mögliche und vorkommende...


Vielen Dank fürs Lesen, noch mehr würde ich mich natürlich über eine Antwort freuen!  :D
Marius

1) = Die Inkonsistenzen der aufgezeichneten Daten in der Übergangszeit würde ich in Kauf nehmen!

GaiusMarius

Hallo ch.eick, danke für deine Antwort!

Ich muss gestehen, dass ich auch gleichzeitig bei https://forums.mysql.com/read.php?70,691206,691206#msg-691206 gefragt habe...   ::)

Die Antwort dort

zu löschende Zeilen anzeigen:
SELECT
    *
FROM
    `history` a
JOIN `history` b USING(TIMESTAMP, reading)
WHERE
    a.device = 'DatabaseLog' AND b.device = 'DbLog';

löschen:

DELETE
    a
FROM
    `history` a
JOIN `history` b USING(TIMESTAMP, reading)
WHERE
    a.device = 'DatabaseLog' AND b.device = 'DbLog';
hat den Vorteil, die Werte der READINGs nicht kennen zu müssen.

Ich habe daher diese Variante benutzt. Dennoch, bzw. gerade deshalb vielen Dank an Dich, dass du dich um mich bemüht hast!  :D

MfG
Marius



P.S.: Das MySQL-Forum ist nicht ganz so aktiv (anscheinend gibt es nur einen Antwortenden). Daher hatte ich keine große Hoffnung, von dort eine Antwort zu bekommen.

ch.eick

Zitat von: GaiusMarius am 17 November 2020, 11:32:15
Ich muss gestehen, dass ich auch gleichzeitig bei https://forums.mysql.com/read.php?70,691206,691206#msg-691206 gefragt habe...   ::)
P.S.: Das MySQL-Forum ist nicht ganz so aktiv (anscheinend gibt es nur einen Antwortenden). Daher hatte ich keine große Hoffnung, von dort eine Antwort zu bekommen.
Trotzdem bitte nur eine Anfrage stellen, damit nicht alles doppelt gemacht wird.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick