Ankündigung

Einklappen
Keine Ankündigung bisher.

Zwei Tabellen vergleichen und Unterschiede ausgeben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zwei Tabellen vergleichen und Unterschiede ausgeben

    Hallo liebe PHP-Mitstreiter,

    ich bin mal als Neuling in dieses Forum eingestiegen, weil hier wohl sehr qualifiziert und hilfreich diskutiert wird. Und da steige ich doch glatt mal mit ein und hoffe auf eure Hilfe.

    Ich habe bei Google so viele Millionen Ergebnisse zum Thema "Tabellen vergleichen" gefunden, aber die einfachste Lösung habe ich nicht gefunden. Vielleicht ist sie zu banal:

    Ich habe zwei Tabellen. Tabelle 1 ist eine aktuelle Tabelle, Tabelle 2 ist eine gleich aufgebaute Tabelle, nur dass dort der Datenbestand einige Wochen älter ist. Einige Datensätze haben sich also geändert, ggf. sind sogar neue hinzugekommen.

    Jetzt möchte ich alle Datensätze aus Tabelle 1 haben, die von denen in Tabelle 2 abweichen.

    Könnt ihr mir da Tipps geben? Gibt es da Hausmittel von MySQL oder muss ich da selber mit einer Schleife ran? Es geht um MySQL 5.x.

    Herzlichen Dank im Voraus und viele Grüße
    Whiksy

  • #2
    Code:
    SELECT
      feld1, feld2
    FROM
      tabelle1 t1
    LEFT JOIN
      tabelle2 t2
    ON
      t1.id = t2.id
    WHERE
      t2.feld1 IS NULL
    OR
      t1.feld1 <> t2.feld1
    OR
      t1.feld1 <> t2.feld2
    So in der Art sollte das gehen, musst halt die Tabellen und Felder noch anpassen.

    Kommentar


    • #3
      Willst Du nur die neuen Daten sehen, oder auch die alten Daten?
      Folgende Abfragen liefern nur die neuen Datenzeilen.

      Bei ORACLE geht dass so...

      Code:
      SELECT * from tabelle_neu 
      MINUS
      SELECT * from tabelle_alt
      Bei MySQL eben etwas komplizierter z.B. so (oder siehe @draco88 )

      Code:
      SELECT col1, col2, col3
        FROM tabelle_neu
       WHERE (col1, col2, col3) NOT IN (SELECT col1, col2, col3 
                                          FROM tabelle_alt)
      Ich habe beispielhaft drei Spalten (col1, col2, col3) angenommen.
      Aber Vorsicht: Je nach Datenmenge kann so eine Abfrage echt ein "Server-Killer" sein.

      Grüße
      Thomas

      Kommentar


      • #4
        Hallo zusammen und vielen Dank für eure Vorschläge.
        Ich dachte immer, dass WHERE ... NOT IN ... nur einschlägig ist, wenn die Daten in der anderen Tabelle nicht bestehen. In meinem Fall bestehen ja 99% der Datensätze, nur dass sie ggf. abweichen. Fällt das dann auch unter "NOT IN"?

        Die Lösung von Draco finde ich auch gut, vor allem, weil ich nicht zwingend alle Felder vergleichen muss. Denn das Feld "last_login" wird sich ja sicherlich häufig ändern, das ist aber für mich nicht wichtig.

        Wegen der Perfomance habe ich mir noch keine Gedanken gemacht. Die Tabelle hat aber schon so um die 5000 Einträge und (wenn ich mich richtig erinnere) 2 MB Größe. Ich werde das mal in Kürze alles testen.

        schon mal bis hierher vielen Dank
        Whisky

        Kommentar


        • #5
          Hast Du gemeinsame IDs? Sonst wird das nämlich sehr schwierig. Denn, je nachdem was „geändert“ bei Dir bedeutet, kann man dann nicht mehr zwischen einem neuen und einem geänderten Datensatz unterscheiden.
          [COLOR="#F5F5FF"]--[/COLOR]
          [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
          [COLOR="#F5F5FF"]
          --[/COLOR]

          Kommentar


          • #6
            Was darf ich unter gemeinsamen IDs verstehen? Gleiche ID für "gleichen" Datensatz? Ja, hab ich

            Herr Müller hat also in der neuen und in der alten Tabelle die gleiche ID, sofern er nicht neu hinzugekommen ist.
            Ich könnte also auch die neue Tabelle nehmen und per Schleife einfach die Datensätze durchlaufen lassen. Ich brauche dann ja nur in der "alten" Tabelle den jeweiligen Datensatz über die ID zu ermitteln und (z.B. per Feld-Vergleich) prüfen, ob Änderungen vorliegen.
            Das wäre dann meine ursprünglich geplante PHP-Lösung. Und auf der Suche war ich jetzt nach einer (vielleicht besseren) MySQL-Lösung.

            Gruß
            Whiksy

            Kommentar


            • #7
              Bei ID Gleichheit ist das mehr oder weniger simpel, da zählt nur die Frage: Welcher Datensatz ist neuer?

              Für einen "echten" Adressenabgleich/Doublettenfinder gibt es fertige (und teuere) Software - das Thema ist nicht trivial und erfordert eigentlich immer noch manuelle Entscheidungshilfen...
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Nein, ein Douplettenfinder muss nicht sein. Es geht wirklich nur im die Frage

                Besteht zwischen dem Datensatz aus der Tabelle X ein Unterschied zu dem aus Tabelle Y? Wenn ja, dann zeige mir den Datensatz aus Tabelle X (den Unterschied o.ä. brauch ich gar nicht zu sehen). Ist kein Unterschied da, dann vergiss es einfach und gehe zum nächsten Datensatz.

                Ich glaube fast, die Schleife wäre die einfachste Lösung, oder?
                GRuß
                Whisky

                Kommentar


                • #9
                  Genau das macht mein Query, gibt alle Datensätze aus Tabelle 1 aus, die in Tabelle 2 nicht existiert oder anders ist.

                  Bei 5000 Datensätzen sollte das auch noch recht flott gehen.

                  Kommentar


                  • #10
                    Wenn Tabelle 1 aktuell ist, brauchst Du doch nur die Tabelle 2 hinzufügen. Mit einer uniqe ID und INSERT IGNORE schliesst Du die alten gleichen IDs aus. Und für die Zukunft fügst Du am besten gleich ein Timestamp mit hinzu. Der aktualisiert sich dann selbst.
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar


                    • #11
                      Vielen dank! Ja, das mit dem Timestamp hatte ich anfangs als einfachste Lösung angedacht. Dabei bin ich jedoch an dem Problem gescheitert, dass ich dies ja auf den kompletten Datensatz bezieht. Also auch Änderungen am Feld "last_login" oder ähnliches würden den Timestamp aktualisieren. Mit draco88's Lösung könnte ich konkrete Felder vergleichen.

                      Oder ich müsste die ganze Struktur der Datenbank ändern, aber das steht völlig außerfrage.

                      Ich werde mal die Tage etwas basteln und hoffentlich meinen Erfolg verkünden.
                      Viele Grüße
                      Whisky

                      Kommentar

                      Lädt...
                      X