Joomla – Development – MySQL Statement mit UNION

Joomla Version 3.2

Situation

Aktuell programmiere ich an einer Joomla Komponente und benötige eine SQL-Abfrage über 4 Tabellen. Dabei wird eine eigene Tabelle und die Joomla “Users” abgefragt. Als Ergebnis werden Werte entweder aus allen Tabellen oder nur aus der Joomla “Users” erwartet. Da dies mit einem Joint und / oder einer Where ColumnName IS NULL z.B. nicht zu lösen war, stieß ich auf die Möglichkeit des SQL Statements UNION. Dieses verbindet u.a. zwei oder mehr SELECT Abfragen zu einer.

Lösung

Als nächstes folgt eine abgespeckte Lösungsmöglichkeit eines Joomla basierten UNION Statements, dass so auch für andere Abfragen bentutz werden kann.


// abzufragende Joomla UserID z.B. 633
 $juser_id = 633;

// Bildgröße z.b. 400x400
$picture_size = '400x400';

// Variable für den finalen Querystring
$query_string ='';

// aufbauen der Datenbankverbindung vorbereiten der Queries
 $db = JFactory::getDbo();
 $query1 = $db->getQuery(true); //1. select
 $query2 = $db->getQuery(true); //2. select
 $subquery = $db->getQuery(true); //benötigt für union

$query1
->select($db->quoteName('a.name'), ($db->quoteName('b.picture_size') )
->from('#__users AS a')
-> join('LEFT', '#__myTable AS b AS b ON a.id = b.myID')
->where($db->quoteName('a.id') . '=' . $db->quote('juser_id') . 'AND' .$db->quoteName('b.picture_size'. '=' .$db->quote($picture_size) )
;

$query2
->select($db->quoteName('a.name'), ($db->quoteName('b.picture_size') )
->from('#__users AS a')
-> join('LEFT', '#__myTable AS b AS b ON a.id = b.myID')
 ->where($db->quoteName('a.id') . '=' . $db->quote('juser_id')  )
;

// nun das entscheidende, die Verbindung beider Queries mittels Union
$subquery->UNION($query2);
$query_string = $query1 . ' ' .$subquery->union;

// ausführen der Query und als Objektliste laden
$db->setQuery($string);
$results = $db->loadObjectList();

Erklärung

Also dies ist ein Beispiel vom eigentlich Problem und übersetzt geschrieben ;). Da die Abfrage aus dem ersten Query bei einem nicht vorhanden sein der “Picture_Size” in Table B zu einer Null-Ausgabe führt und das obwohl die restlichen Einträge vorhanden währen (UserID, Username, etc.) kommt man hier mit einem einfachen JOIN nicht weiter. Die Verbindung der ersten Query und der zweiten Query mittels UNION führt nun dazu, dass dennoch die Tabellen Werte aus der Tabelle A als Ergebnis für den USER 633 zurück gegeben werden. Dabei werden doppelte Spalten eleminiert und die Spalte Picture_Size mit “NULL” gefüllt. Die Konstruktion von Query1 und Query2 zu einem String mittels einer Subquery ist so in Joomla nur möglich, da Joomla von haus aus wohl nur eine Select-Abfrage erlaubt. Das hatte ich irgendwo bei meinen Recherchen mal gelesen. Ich hoffe es ist so verständlich, ansonsten einfach mal ausprobieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.