Henry: mysql mehrere Tabellen abgleichen

Hallo,

was ist die einfachste (nicht komplexe, leicht nachvollziehbare)Möglichkeit zwei Tabellen abzugleichen?

Bsp.

table_a hat unter anderem die Spalten id,a,b,c,d,x

Nun möchte ich aus einer ähnlichen Tabelle table_b (id,a,b,c) die Reihen in table_a rausfinden die in a,b,c übereinstimmen und in dem Fall in table_a die Spalte x (ein Zähler) um eins erhöhen also +1.

Zu beachten dabei ist aber, dass die Werte in table_a als auch in table_b (nicht die id, also nur a,b,c) auch mehrmals vorkommen können. Wenn also in table_b mehrmals der Eintrag vorkommt, dann muss jede gleiche Reihe in table_a den Zähler (x) erhöht bekommen.

Gruss
Henry

--
Meine Meinung zu DSGVO & Co:
„Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
  1. Hallo Henry,

    ein echter Abgleich ist was anderes und geht meistens nur durch Programmierung, aber wenn Du nur Zähler erhöhen willst, dann wäre mein Ansatz dieser. Ich markiere ihn aber als BAD, aus nachstehend erläuterten Gründen.

    Was ich nicht verstanden habe, ist, ob Du den Zähler in table_a um die Anzahl der äquivalenten Rows aus table_b erhöhen willst, oder ob Du um 1 erhöhen willst, wenn es eine (beliebig umfangreiche) Übereinstimmung gibt.

    Dieses SQL erhöht den Zähler um die Anzahl der äquivalenten Rows. Andernfalls musst Du um den SELECT noch ein CASE-Konstrukt oder ein IF() herumlegen.

    UPDATE table_a
    SET    counter = counter + (SELECT COUNT(*) 
                                FROM table_b    
                                WHERE table_a.a = table_b.a 
                                  AND table_a.b = table_b.b
                                  AND table_a.c = table_b.c)
    

    Nachteil: wenn es 17 Zeilen in table_a gibt, für die die Spalten a, b und c die gleichen Werte haben, wird der Subselect 17 mal ausgeführt. Wenn a,b,c nicht die ersten Spalten eines Index sind, wird der Subselect obendrein noch zum Table Scan auf table_b führen.

    Eventuell kann das durch Caching ausgeglichen werden, das hängt von deinen Tables und deinen Indexen ab. Wenn beide Tables groß sind, bringst Du den Server durch diese Query ggf. zur Rotglut.

    Weiterer Nachteil: Woher weißt Du, welche Zeilen aus table_b bereits gezählt wurden? Lässt Du dir Query zweimal laufen, hast Du die counter-Spalter zweimal erhöht. Wenn Du ganz gezielt eine Einmalquery zwecks DB-Wartung planst, ist das ok, aber andernfalls würde ich nochmal drüber nachdenken.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Rolf,

      Ich markiere ihn aber als BAD, aus nachstehend erläuterten Gründen.

      Das ist verständlich aber auch genau was ich erhoffte.

      Wenn beide Tables groß sind, bringst Du den Server durch diese Query ggf. zur Rotglut.

      Das werde ich erst später wissen, kann ich im Moment leider noch nicht testen. Dein Query sieht aber sehr vielversprechend aus, vielen lieben Dank.

      Gruss
      Henry

      --
      Meine Meinung zu DSGVO & Co:
      „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“