<?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>ebene7 &#187; Formatierung</title>
	<atom:link href="http://blog.ebene7.com/schlagwort/formatierung/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ebene7.com</link>
	<description></description>
	<lastBuildDate>Tue, 04 Jun 2013 18:57:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Aufzählungen mit GROUP_CONCAT()</title>
		<link>https://blog.ebene7.com/2010/11/02/aufzaehlungen-mit-group-concat/</link>
		<comments>https://blog.ebene7.com/2010/11/02/aufzaehlungen-mit-group-concat/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 05:00:13 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Formatierung]]></category>
		<category><![CDATA[Funktion]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=2159</guid>
		<description><![CDATA[Für verschiedene Anwendungsfälle ist es übersichtlicher, wenn 1:n Beziehungen als Aufzählung angezeigt werden. Für dieses Beispiel verwende ich eine kleine, übersichtliche Tabelle mit Emailadressen und deren Aliase. CREATE TABLE `mails` ( `id` int(11) NOT NULL auto_increment, `parent_id` int(11) NOT NULL, &#8230; <a href="https://blog.ebene7.com/2010/11/02/aufzaehlungen-mit-group-concat/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Für verschiedene Anwendungsfälle ist es übersichtlicher, wenn 1:n Beziehungen als Aufzählung angezeigt werden. Für dieses Beispiel verwende ich eine kleine, übersichtliche Tabelle mit Emailadressen und deren Aliase.<span id="more-2159"></span></p>
<pre>CREATE TABLE `mails` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) NOT NULL,
  `addy` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8</pre>
<p>Jede Emailadresse hat eine Id und eine ParentId. Sind beide Ids identisch, dann ist es die Originaladresse, ansonsten ein Alias.</p>
<pre>mysql&gt; select * from mails;
+----+-----------+------------------+
| id | parent_id | addy             |
+----+-----------+------------------+
|  1 |         1 | m1@example.com   |
|  2 |         1 | a1m1@example.com |
|  3 |         3 | m2@example.com   |
|  4 |         1 | a2m1@example.com |
|  5 |         3 | a1m2@example.com |
+----+-----------+------------------+
5 rows in set (0.00 sec)
</pre>
<p>Mit einem selbstreferenzierenden Join werden die Daten nun wieder aus der Tabelle ausgelesen. Dabei wird die Tabelle &#8216;mails&#8217; durch Aliasnamen wie zwei Tabellen behandelt. Wir selektieren die &#8216;addy&#8217; aus der Tabelle &#8216;m1&#8242; und die gejointen Aliase aus &#8216;m2&#8242;. Durch <a href="http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat" target="_blank">GROUP_CONCAT()</a> werden die Werte nun kommasepariert in der Spalte &#8216;aliases&#8217; ausgegeben.</p>
<pre>mysql&gt; SELECT m1.addy, GROUP_CONCAT(m2.addy SEPARATOR ', ') AS aliases
 -&gt;   FROM mails m1
 -&gt;   JOIN mails m2 ON m2.parent_id = m1.id
 -&gt;  WHERE m2.id &lt;&gt; m2.parent_id
 -&gt;  GROUP BY m1.id;
+----------------+--------------------------------------+
| addy           | aliases                              |
+----------------+--------------------------------------+
| m1@example.com | a1m1@example.com, a2m1@example.com   |
| m2@example.com | a1m2@example.com                     |
+----------------+--------------------------------------+
2 rows in set (0.00 sec)
</pre>
<p>Das funktioniert natürlich auch mit den Ids der Alias-Adressen. In diesem Fall muss dann aber der Rückgabewert von GROUP_CONCAT() gecastet werden, da sonst entweder nur die erste Id oder [BLOB] in der Ausgabe stehen würde.</p>
<pre>mysql&gt; SELECT m1.addy,
 -&gt;           CAST(GROUP_CONCAT(m2.id SEPARATOR ', ') AS char) AS alias_ids
 -&gt;   FROM mails m1
 -&gt;   JOIN mails m2 ON m2.parent_id = m1.id
 -&gt;  WHERE m2.id &lt;&gt; m2.parent_id
 -&gt;  GROUP BY m1.id;
+----------------+-----------+
| addy           | alias_ids |
+----------------+-----------+
| m1@example.com | 2, 4      |
| m2@example.com | 5         |
+----------------+-----------+
2 rows in set (0.00 sec)
</pre>
<p>Die Funktion kann nicht nur gruppieren und mit beliebigen Trennzeichen aufzählen, es ist auch möglich, eine Sortierrichtung mit anzugeben. Mehr dazu im MySQL-Manual.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/11/02/aufzaehlungen-mit-group-concat/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
