Beiträge von Shuddery

    Warum braucht man in dem Fall die "Movies" und "Episodes" Tabellen überhaupt? Soweit ich das überblicke, muss am Ende ja ohnehin nur die files-Tabelle abgeglichen werden? Dann kann man doch aus der alten DB auch nur Werte aus dieser Tabelle holen…

    Vorher prüfen ob es doppelte Datenamen gibt, weil das wird in dem Fall natürlich nicht funktionieren:

    SQL
    SELECT strFilename, COUNT(strFilename) AS Wie_oft_doppelt
     FROM Files
     WHERE playCount > 0
     GROUP BY strFilename
     HAVING (COUNT(strFilename) > 1)
     ORDER BY Wie_oft_doppelt DESC;


    Benötigte Daten abrufen:

    SQL
    SELECT strFilename, playCount, lastPlayed, dateAdded FROM Files WHERE playcount > 0


    Suchergebnis "Als SQL kopieren" und wie ob oben in UPDATE statements umwandeln. DAZU ggf in Jake's Vorschlag weitere WHERE-Bedingungen ergänzen. Aktuell werden da die Werte IMMER überschrieben, auch wenn schon ein playCount vorhanden ist! Das kommt natürlich etwas auf die Ansprüche an. Will man nur das "watched" Flag haben, ist das ja egal. Ansonsten braucht es hier ggf. etwas mehr Logik…

    Das klappt natürlich nur wenn es (kaum) doppelte Dateinamen gibt. Weil das UPDATE statement wird dann voraussichtlich die Daten von ALLEN Einträgen mit dem gleichen Dateinamen überschreiben.

    Aber für Datenbanken mit eindeutigen Dateinamen dürfe das deutlich einfacher gehen, oder?

    Hinweis: (insbesondere vor Ausführung des UPDATE-scripts) Backup erstellen!

    Ja, das kann man leicht beheben. Runde Klammern werden bei RegExp verwendet um Gruppen zu definieren. Wenn man tatsächlich eine Klammer verwenden will, muss man ein \ davor schreiben:

    SQL
    UPDATE files SET playCount = '\3', lastPlayed = '\4', dateAdded = '\5' WHERE idFile IN \(SELECT idFile FROM movie WHERE c00 = "\1" AND premiered = '\2'\);

    Da muss man eigentlich nicht viel selbst machen, das erledigt Notepad++ (oder jeder andere ernstzunehmende Editor) mit regulären Ausdrücken ganz alleine.

    Für Notepad++:

    • Suchen und Ersetzen öffnen
    • Suchen nach:
      Code
      .* VALUES \('(.*)', '(.*)', '(.*)', '(.*)'\);
    • Ersetzen durch:
      SQL
      UPDATE files SET playCount = '\2', lastPlayed = '\3', dateAdded = '\4' WHERE strFilename = '\1' AND playCount = NULL
    • Suchmodus: Reguläre Ausdrücke

    • "alles ersetzen" anklicken.
    • Anschließend das Ergebnis auf Plausibilität prüfen!
    • Erst auf einer KOPIE der Tabelle prüfen! Bei Problemen mit der WHERE-Klausel kann es leicht passieren, dass einfach ALLE Einträge der Tabelle geändert werden.

    Nachteil hier ist eben, dass das nur gut funktioniert, wenn die Dateinamen eindeutig sind. Wenn Serien immer nur "S01E01.mkv" heißen, dann klappt das natürlich nicht :)

    Wäre es denn nicht insgesamt einfacher, sich aus den Originaldatenbanken einfach die benötigten Infos direkt zu kopieren?

    Der Übersichtlichkeit halber vielleicht nach Medientyp getrennt, z.B. für Filme (modifiziert nach Original von JakeB):

    SQL
    SELECT
     m.c00 AS Filmtitel,
     m.premiered AS Jahr,
     f.playCount,
     f.lastPlayed,
     f.dateAdded
     FROM files f
      LEFT JOIN movie m ON f.idFile = m.idFile
     WHERE f.playCount IS NOT NULL AND m.c00 IS NOT NULL
     ORDER BY m.c00;

    Dann im DB Browser in der Vorschau mit CTRL+A alles markieren, rechts klicken und "Als SQL kopieren". Das gibt dann ganz viele "INSERT INTO" Anweisungen, die muss man dann eben in "UPDATE" Anweisungen für die neue Tabelle umarbeiten:

    Vorher:

    SQL
    INSERT INTO "main"."" ("Filmtitel", "Jahr", "playCount", "lastPlayed", "dateAdded") VALUES ('Collateral Beauty', '2016-12-06', '1', '2020-10-31 20:27:37', '2018-06-15 01:37:37');

    Nachher:

    SQL
    UPDATE Filmtabelle
    SET playCount = '1', lastPlayed = '2020-10-31 20:27:37', dateAdded = '2018-06-15 01:37:37'
    WHERE Filmtitel = 'Collateral Beauty'

    (Tabellenname fiktional, weiß ja nicht, wie die Zieldatenbank aussieht :)

    Oder denke ich da zu einfach?