<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>meier-online &#187; Sql</title>
	<atom:link href="http://meier-online.com/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://meier-online.com</link>
	<description>Der Blog von Karsten Meier</description>
	<lastBuildDate>Sun, 09 Oct 2011 13:27:57 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>SQL: Feld aus verknüpfter Tabelle setzen</title>
		<link>http://meier-online.com/2009/05/sql-update-join/</link>
		<comments>http://meier-online.com/2009/05/sql-update-join/#comments</comments>
		<pubDate>Mon, 04 May 2009 13:01:28 +0000</pubDate>
		<dc:creator>meier</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[Joomla]]></category>
		<category><![CDATA[Sql]]></category>

		<guid isPermaLink="false">http://meier-online.com/?p=400</guid>
		<description><![CDATA[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 &#8220;Joomla&#8221; umgestellt. Zur Mitgliederverwaltung wird die Erweiterung &#8220;Community Builder&#8221; eingesetzt. Bisher hatten die Nutzer eine Nummer als Loginnamen. Diese Nummer soll jetzt für alle alten Nutzer in ein Feld &#8220;Mitgliedsnummer&#8221; [...]]]></description>
			<content:encoded><![CDATA[<h3>Ein kleiner Kniff für den Joomla Community Builder</h3>
<p>Neulich erhielt ich eine kleine Auftragsanfrage. Ein bestehende Webanwendung wird stark erweitert und dabei auf das CMS &#8220;Joomla&#8221; umgestellt. Zur Mitgliederverwaltung wird die Erweiterung &#8220;Community Builder&#8221; eingesetzt.<br />
Bisher hatten die Nutzer eine Nummer als Loginnamen. Diese Nummer soll jetzt für alle alten Nutzer in ein Feld &#8220;Mitgliedsnummer&#8221; überführt werden. So weit die Anforderung aus Kundensicht.</p>
<h3>Analyse</h3>
<p>Joomla verwaltet die Benutzer in einer Tabelle <em>jos_user</em>. <span id="more-400"></span>Der &#8220;Community Builder&#8221; ermöglicht es, zu einem Nutzerdatensatz weitere Felder hinzuzufügen. Die Felder landen in der gesonderten Tabelle <em>jos_profiler</em>. 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.</p>
<p><img class="alignnone size-full wp-image-406" title="Grafische Darstellung des Problems: ein Feld soll aus einer verknüpften Tabelle kopiert werden" src="http://meier-online.com/blog/uploads/update-joined-table.png" alt="Grafische Darstellung des Problems: ein Feld soll aus einer verknüften Tabelle kopiert werden" width="380" height="200" /></p>
<p>Die Anforderung lautet demnach: Für alle<em> jos_user</em> Datensätze, die eine Zahl im Feld username haben, setze diese Zahl in das Feld Mitgliedsnummer des dazugehörigen Datensatzes in der Tabelle <em>jos_profiler</em>.</p>
<h3>Geht das mit SQL?</h3>
<p>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.</p>
<h3>Auswahl aller Zahlen</h3>
<p>Glücklicherweise unterstützt die verwendete MySQL Datenbank reguläre Ausdrucke. Alle usernamen, die nur aus Ziffern bestehen, lassen sich so abrufen:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> username <span style="color: #993333; font-weight: bold;">FROM</span> jos_users <span style="color: #993333; font-weight: bold;">WHERE</span> username <span style="color: #993333; font-weight: bold;">REGEXP</span> <span style="color: #ff0000;">'^[0-9]+$'</span></pre></div></div>

<h3>Verknüpfung beider Tabellen</h3>
<p>DieVerknüpfung zweier Datenbanktabellen wird auch als &#8220;join&#8221; bezeichnet, in unserem Fall ein &#8220;inner equijoin&#8221;.<br />
Um das Feld <em>username</em> und die Mitgliedsnummer gleichzeitig anzuzeigen, verwenden wir:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> jos_users<span style="color: #66cc66;">.</span>username<span style="color: #66cc66;">,</span> jos_comprofiler<span style="color: #66cc66;">.</span>cb_mitgliedsnummer
<span style="color: #993333; font-weight: bold;">FROM</span> jos_comprofiler<span style="color: #66cc66;">,</span> jos_users
<span style="color: #993333; font-weight: bold;">WHERE</span> jos_comprofiler<span style="color: #66cc66;">.</span>user_id <span style="color: #66cc66;">=</span> jos_users<span style="color: #66cc66;">.</span>id</pre></div></div>

<p>Diese Anweisung hilft auch bei der Kontrolle, ob am Ende alles richtig gesetzt ist.</p>
<h3>Setzen der Daten</h3>
<p>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 <em>UPDATE</em> Befehl von SQL.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">UPDATE</span> jos_comprofiler<span style="color: #66cc66;">,</span> jos_users
<span style="color: #993333; font-weight: bold;">SET</span> jos_comprofiler<span style="color: #66cc66;">.</span>cb_mitgliedsnummer <span style="color: #66cc66;">=</span> jos_users<span style="color: #66cc66;">.</span>username
<span style="color: #993333; font-weight: bold;">WHERE</span> jos_comprofiler<span style="color: #66cc66;">.</span>user_id <span style="color: #66cc66;">=</span> jos_users<span style="color: #66cc66;">.</span>id
  <span style="color: #993333; font-weight: bold;">AND</span> jos_users<span style="color: #66cc66;">.</span>username <span style="color: #993333; font-weight: bold;">REGEXP</span> <span style="color: #ff0000;">'^[0-9]+$'</span></pre></div></div>

<p>Mit einem einzigen SQL-Befehl konnte das Kundenproblem gelöst werden. Möglich macht diese Magie der mathematische Unterbau von SQL, die relationale Algebra.</p>
]]></content:encoded>
			<wfw:commentRss>http://meier-online.com/2009/05/sql-update-join/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

