Text an Spalten in MySQL-Abfragen anhängen

Manchmal kommt man in die Lage, dass man mehrere Anfragen an die MySQL-Datenbank miteinander verknüpfen muss. Dabei kann es schnell vorkommen, dass man zwar ähnliche Datenbestände zusammen krault, aber diese unterschiedlich weiterverarbeiten muss.

Will man zum Beispiel bei einer Suchanfrage mehrere Tabellen druchsuchen, und dann immer eine Titelzeile und einen kurzen Text angeben, jedoch je nachdem in welcher Tabelle man fündig geworden ist einen anderen Link, ist man mit CONCAT gut bedient.

CONCAT is ein Befehl der in MySQL den Verbindungsoperator ersetzt. Will ich in PHP die Werte zweier Variabeln verknüpfen, tu ich das mit einem Punkt, in JavaScript mit einem Plus.

<?php
$var = 'Mein Name ist ';
$var2 = 'Markus';
echo $var.$var2;
?>

bzw.

var text = 'Mein Name ist ';
var name = 'Markus';
alert(text + markus);

MySQL fehlt solch ein Verbindungsoperator, stattdessen verknüpft man mittels CONCAT.

Dabei kann man sowohl Spalten miteinander, Spalten mit beliebigem Text und Text mit Text verknüpfen.

SELECT title,text,CONCAT('index.php?id=', id) FROM articles;

Die Handhabung ist simpel, einfach die zwei zu verbindenden Elemente in die Funktion, und fertig. In meinem Besipiel binde ich den Inhalt der Spalte id an den Text index.php?id= das ermöglicht mir eine sehr chaotische Abfrage die zum Besipiel die Datensätze meherer mit UNION verknüpften Abfragen je nach gewünschter Priorität sortieren kann und dennoch immer den richtigen Link zum Objekt zurückliefert.

Für jene denen UNION nichts sagt: Damit kann man mehrere MySQL-Abfragen auf einmal machen und sie sich wie eine ausgeben lassen:

(SELECT heading title, content text, CONCAT('index.php?get=article&id=', id) url, time FROM articles)
UNION
(SELECT title, text, CONCAT('index.php?get=topic?id=', id) url, time FROM topics)
ORDER BY time DESC LIMIT 25

Das zum Beispiel würde mir jetzt ein Ergebnis aus den beiden Tabellen articles und topics liefern. Dadurch, dass ich die Spalten von articles mit ALIASEN gleich genannt habe wie die der topics und den CONCAT zweimal mit dem ALIAS url versehen habe, kriege ich jetzt ein Ergebnis mit den Spalten title, text, url und time zurück und zwar durcheinander aus beiden Spalten weil ich nach time sortiere. Demnach also die 25 neuesten aus zwei völlig unterschiedlichen Spalten.

So realisiere ich zum Beispiel einen RSS-Feed der die neusten Elemente aller Tabellen die ich auf einer Webseite kriegen kann enthält, so kann der Benutzer aus einem Feed über neueste Artikel, Tutorials, Forenbeiträge, Antworten und Kommantare in einem Feed und ohne großes Tam-Tam beim programmieren desselbigen informiert werden.

Kommentare

MySQL-Schlaumeier am Mittwoch, 30. Juli 2008 um 15:00

MySQL verwendet automatisch die Spaltennamen der ersten Abfrage, die Spaltennamen der weiteren Abfragen werden ignoriert. Lediglich der Typ muss übereinstimmen.