dedlfix: SQL Abfrage

Beitrag lesen

Hi!

Wenn eine Subquery nichts findet, ist ihr Ergebnis NULL. Da kann man herausfinden, indem man die Abfrage mal im phpMyAdmin oder anderen Verwaltungstools laufen lässt. Allerdings nicht mit CONCAT() sondern die Felder direkt ausgeben, sonst sieht man nur das, was CONCAT() draus macht und nicht das eigentliche Ergebnis. Und dieses eigentliche Ergebnis, speziell der tx_holidayweb_themes-Abfrage, soll ja Gegenstand der Veränderung sein, also muss es auch genau angeschaut werden. Versuch das erstmal nachzuvollziehen und schau, ob du NULL oder was anderes siehst.

Wenn du da nun schöne NULLs siehst, dann schau dir die bereits verlinkte Handbuchseite an, genauer die Funktion IFNULL(). Damit kannst du entweder den Nicht-NULL-Wert oder einen Ersatzwert bei NULL bekommen.

Wenn ich im PHMmyAdmin in de Tabelle: tx_holidayweb_regions
die Abfrage: SELECT title FROM tx_holidayweb_regions WHERE uid = region_uid LIMIT 1
bekomme ich die Fehlermeldung: #1054 - Unknown column 'region_uid' in 'where clause'

Diese Spalte region_uid bezieht sich auf die äußere Query. Die inneren Selects sind korrelierte Subquerys. Die, die du gerade getestet hast, soll ein Ergebnis liefern, wenn ihre uid mit der region_uid der äußeren Query übereinstimmt. Wenn du sie zum Test allein laufen lassen willst, musst du statt region_uid einen Wert zu Fuß angeben. Aber wenn du die Query allein laufen lässt, kommt entweder eine Ergebnismenge oder keine, also gar nichts. In dem Fall siehst du das NULL nicht, das kommen muss, wenn die Query als Subquery läuft. Deshalb war mein Vorschlag zum Nachvollziehen unter eingermaßen realistischen Endbedingungen nur den CONCAT-Aufruf zu entfernen, so dass die Subquerys nicht mehr Parameter der CONCAT-Funktion sind, sondern Felder der äußeren Query. Das heißt konkret, die gesamte Query in den PMA kopieren, CONCAT und seine Klammern entfernen (aber nicht die um die Subquerys) und dann das Ergebnis anschauen. Ist NULL zu sehen? Bestens, dann die Subquery in IFNULL(subquery, ersatzwert) einsetzen, den gewünschten Ersatzwert als zweiten Parameter festlegen und zur Probe laufen lassen. Dann das CONCAT() wieder wie bisher einbauen.

Lo!