Rolf B: mysql mehrere Tabellen abgleichen

Beitrag lesen

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