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.
Interessiert in verschiedenste IT Themen, schreibe ich in diesem Blog über Software, Hardware, Smart Home, Games und vieles mehr. Ich berichte z.B. über die Installation und Konfiguration von Software als auch von Problemen mit dieser. News sind ebenso spannend, sodass ich auch über Updates, Releases und Neuigkeiten aus der IT berichte. Letztendlich nutze ich Taste-of-IT als eigene Dokumentation und Anlaufstelle bei wiederkehrenden Themen. Ich hoffe ich kann dich ebenso informieren und bei Problemen eine schnelle Lösung anbieten. Wer meinen Aufwand unterstützen möchte, kann gerne eine Tasse oder Pod Kaffe per PayPal spenden – vielen Dank.