MySQL: UPDATE auf mehreren Tabellen und Subqueries

Wer sich mal ein bißchen näher mit SQL beschäftigt, wird über die Ausdrucksmächtigkeit und Performance erstaunt sein. SQL kann eben doch mehr als simple SELECT-Anweisungen zu verarbeiten.

Mal ein Beispiel, was man alles mit UPDATE-Anweisungen machen kann:

Wir haben folgende Tabellen

1. Team

  • Teamid
  • Teamname
  • AnzahlMitglieder

2. User

  • Userid
  • Username
  • Teamid

Nun wollen wir das noch leere Feld Team.AnzahlMitglieder aus der Tabelle User berechnen. Naiver Ansatz ist wahrscheinlich folgendes UPDATE-Statement, wenn man sich vorher klar macht, dass man Subqueries verwenden kann, um Werte zu setzen:

UPDATE Team
SET
	AnzahlMitglieder =
		(SELECT COUNT(*)
		FROM User
		WHERE User.Teamid = Team.Teamid )

Problem an dieser Abfrage ist allerdings, dass für jede Zeile, die aktualisiert werden soll, das Subquery ausgeführt wird. Bei kleineren Datenmengen macht das nichts, wenn es allerdings Millionen an Datensätze sind, braucht das UPDATE ewig.

Wie könnte die Lösung aussehen? Richtig, man führt den Subquery nur 1x für alle Teams aus und selektiert den jeweiligen Eintrag dann für das entsprechende Team:

UPDATE
    Team,
    (SELECT teamid,
        COUNT(*) as anzahl,
    FROM User) AS usersub
SET
    Team.AnzahlMitglieder = usersub.anzahl
WHERE
    Team.Teamid = usersub.teamid)

Auch interessant:

  1. Komplizierteste SQL-Query ever
  2. MySQL: Order By – NULL-Werte
  3. SQL IN und =