Artikelformat

SQL: Feld aus verknüpfter Tabelle setzen

Ein kleiner Kniff für den Joomla Community Builder

Neulich erhielt ich eine kleine Auftragsanfrage. Ein bestehende Webanwendung wird stark erweitert und dabei auf das CMS “Joomla” umgestellt. Zur Mitgliederverwaltung wird die Erweiterung “Community Builder” eingesetzt.
Bisher hatten die Nutzer eine Nummer als Loginnamen. Diese Nummer soll jetzt für alle alten Nutzer in ein Feld “Mitgliedsnummer” überführt werden. So weit die Anforderung aus Kundensicht.

Analyse

Joomla verwaltet die Benutzer in einer Tabelle jos_user. Der “Community Builder” ermöglicht es, zu einem Nutzerdatensatz weitere Felder hinzuzufügen. Die Felder landen in der gesonderten Tabelle jos_profiler. Mithilfe der ID sind diese beiden Datensätze verknüpft. Auf diese Weise muss der Community Builder keine Tabellen des Joomla-Kerns verändern. Allerdings ist das Hantieren mit zwei Tabellen natürlich programmtechnisch aufwendiger und fehleranfälliger.

Grafische Darstellung des Problems: ein Feld soll aus einer verknüften Tabelle kopiert werden

Die Anforderung lautet demnach: Für alle jos_user Datensätze, die eine Zahl im Feld username haben, setze diese Zahl in das Feld Mitgliedsnummer des dazugehörigen Datensatzes in der Tabelle jos_profiler.

Geht das mit SQL?

Man kann das Problem sicherlich durch ein kleines PHP-Programm lösen. Wenn es mit einem SQL Befehl funktioniert, ist das viel einfacher. Ein Grund für mich, die Dokumentation zu MySQL genauer durchzusehen.

Auswahl aller Zahlen

Glücklicherweise unterstützt die verwendete MySQL Datenbank reguläre Ausdrucke. Alle usernamen, die nur aus Ziffern bestehen, lassen sich so abrufen:

SELECT username FROM jos_users WHERE username REGEXP '^[0-9]+$'

Verknüpfung beider Tabellen

DieVerknüpfung zweier Datenbanktabellen wird auch als “join” bezeichnet, in unserem Fall ein “inner equijoin”.
Um das Feld username und die Mitgliedsnummer gleichzeitig anzuzeigen, verwenden wir:

SELECT jos_users.username, jos_comprofiler.cb_mitgliedsnummer
FROM jos_comprofiler, jos_users
WHERE jos_comprofiler.user_id = jos_users.id

Diese Anweisung hilft auch bei der Kontrolle, ob am Ende alles richtig gesetzt ist.

Setzen der Daten

Als letzter Schritt bleibt noch, das Feld des einen Datensatzes mit dem Inhalt des Felds des korrespondierenden Datensatzes der anderen Tabelle zu setzen. Zum Glück funktionieren die beiden obigen Techniken auch im UPDATE Befehl von SQL.

UPDATE jos_comprofiler, jos_users
SET jos_comprofiler.cb_mitgliedsnummer = jos_users.username
WHERE jos_comprofiler.user_id = jos_users.id
  AND jos_users.username REGEXP '^[0-9]+$'

Mit einem einzigen SQL-Befehl konnte das Kundenproblem gelöst werden. Möglich macht diese Magie der mathematische Unterbau von SQL, die relationale Algebra.

Autor: Karsten Meier

Weil ich gerne Probleme löse bin ich Informatiker geworden. Für meine Kunden berate und konzeptioniere ich und entwickle mit fast allem, was einen Prozessor hat. Sie finden mich auch auf Twitter

1 Kommentar

Hinterlassen Sie eine Antwort

Pflichtfelder sind mit * markiert.