FHEM Forum

FHEM => Sonstiges => Thema gestartet von: GaiusMarius am 16 November 2020, 17:04:49

Titel: [gelöst]MySQL: Benötige Hilfe bei Erstellung einer Query (DbLog)
Beitrag von: GaiusMarius am 16 November 2020, 17:04:49
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 werdenHier 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:

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!
Titel: Antw:MySQL: Benötige Hilfe bei Erstellung einer Query (DbLog)
Beitrag von: GaiusMarius am 17 November 2020, 11:32:15
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 (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.
Titel: Antw:MySQL: Benötige Hilfe bei Erstellung einer Query (DbLog)
Beitrag von: ch.eick am 17 November 2020, 13:04:56
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 (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.