phpbar.de logo

Mailinglisten-Archive

[dbs] Ausgabe von Strings aggregieren

[dbs] Ausgabe von Strings aggregieren

Martin Ramsch m.ramsch at computer.org
Die Apr 20 23:48:57 CEST 2004


Konstantin Rekk schrieb:
> Zeilen mit hilfe einer Stringfunktion (+) zusammenfassen, in etwas so:
[...]
> die Ausgabe sollte autoren gleicher Dokumente zusammengefasst liefern:
>
> 1  olaf,gudrun
> 2  jesus
> 3  n.n.
>
> irgendwie sehe ich nicht wie man das ohne Benutzung von
> stored_procedures o.ä. machen könnte, nur mit "standard"-sql.

Mit Standard-SQL geht es auch nicht, weil es keine mehrwertigen
Attribute kennt (und obiges ist ja nicht kein Einzelwert, sondern
eine Liste von mehreren Autoren).

Man könnte sich zwar eine Aggregatsfunktion vorstellen, die -
ähnlich wie SUM() für Zahlen - Zeichenketten in einer irgendwie
festgelegeten Reihenfolge aneinanderkettet, aber leider gibt's
sowas in Standard-SQL auch nicht.

Die beste Lösung ist meistens, die SQL-Abfrage einfach zu
halten und die Zusammenfassung im Programm zu machen!

Mit PHP und MySQL sieht das skizziert etwa so aus (da fehlen jetzt
noch alle Fehlerprüfungen!):

   $rc = mysql_query('SELECT dok_id, name FROM Author ORDER BY name');
   while ($row = mysql_fetch_assoc($rc)) {
      $author[$row['dok_id']][] = $row['name'];
   }
   foreach ($author as $i=>$a) {
      printf("%s: %s\n", $i, join(', ', $a) );
   }


Wenn die Zusammenfassung wirklich und unbedingt schon gleich mit
der SQL-Query passieren soll, geht mit Standard-SQL nur eine
Lösung mit fester Maximalzahl von Autoren pro Titel, hier im
Beispiel max. 3 Autoren:

  SELECT d1.dok_id,
         CONCAT_WS(", ",d1.author,d2.author,d3.author) AS authors
  FROM d AS d1
         LEFT JOIN
       d AS d2
         ON ( d1.dok_id=d2.dok_id AND d1.author<d2.author )
         LEFT JOIN
       d AS d3
         ON ( d2.dok_id=d3.dok_id and d2.author<d3.author );


Ich hoffe, das hilft weiter ...

Ciao,
  Martin


php::bar PHP Wiki   -   Listenarchive