Auge: Problem mit GROUP_CONCAT in Subquery

Beitrag lesen

Hallo

Ich bilde die Navigationsstruktur einer Seite in einer MySQL-Datenbank ab. Die Tabelle hat (sinngemäß) folgende Struktur.

id | pfad              | titel       | parent | sortierer
--------------------------------------------------------
1  | index.php         | Home        | 0      | 0
2  | k/index.php       | Kontakt     | 0      | 1
3  | k/impressum.php   | Impressum   | 2      | 1
4  | k/datenschutz.php | Datenschutz | 2      | 2

Das Feld parent ist dazu da, die Punkte einer Unternavigation dem zugehörigen Punk der Hauptnavigation zuzuweisen. Es verweist auf das Feld id des Hauptmenüpunkts bzw. ist bei Hauptmenüpunkten mit 0 angegeben. Jeder Hauptnavigationspunkt selbst ist eine index.php im entsprechenden Unterverzeichnis. Der Sortierer legt die Reihenfolge der Ausgabe in den Menüs fest.

Rufe ich eine der Unterseiten auf, baue ich das dazugehörige Untermenü über die mir bereits bekannte ID des parents zusammen. Das funktioniert natürlich nur bei den Unterseiten, da die index.php des Unterpunktes selbst zur Hauptnavigation gehört (parent = 0). Deswegen habe ich Subqueries in einem IF in einem IN in der WHERE-Klausel notiert.

Ich unterscheide im IF, ob parent 0 ist (oder nicht), wenn 0 zutrifft (Hauptmenüpunkt) hole ich alle Einträge, die die aktuelle Seite als parent haben (deren "Kinder"), wenn nicht (die Seite gehört zu einer Unternavigation), hole ich alle ihre "Geschwister", die die gleiche Seite als parent haben.

SELECT  
  id,  
  parent,  
  pfad,  
  titel  
FROM Struktur  
  WHERE id IN(IF((SELECT parent FROM Struktur WHERE id = "[code lang=php]. intval($currentPage['id']) .
~~~") = 0,  
    (SELECT GROUP\_CONCAT(id) AS id FROM Struktur WHERE parent = "`. intval($currentPage['id']) .`{:.language-php}"),  
    (SELECT GROUP\_CONCAT(id) AS id FROM Struktur WHERE parent = "`. intval($currentPage['parent']) .`{:.language-php}")))  
  ORDER by sortierer ASC"[/code]  
  
Was ich schon einmal sagen kann: es funktioniert nicht wie gewünscht.  
  
Lasse ich jeden der drei Subqueries einzeln laufen, geben sie mir die gewünschte Werte aus. Setze ich auf einer der Seiten, bei denen die Bedingung zutrifft bzw. nicht zutrifft den Subquery für den entsprechenden Fall ohne `IF`{:.language-sql} ein, werden mir ebenfalls die gewünschten Werte zurückgegeben. Folgende Beispiele stammen von einem anderen Punkt der Hauptnavigation.  
  
`IF`{:.language-sql}:  
  
~~~sql
SELECT  
parent  
FROM Struktur  
WHERE id = 10
Array  
(  
    [0] => Array  
        (  
            [parent] => 0  
        )  
)

THEN trifft zu, da es sich um einen Hauptmenüpunkt handelt. Der einzeln abgesetzte Query listet brav die ids der zugehörigen Unterpunkte.

SELECT  
GROUP_CONCAT(id) AS id  
FROM Struktur  
WHERE parent = 10
Array  
(  
    [0] => Array  
        (  
            [id] => 11,12,13,14,15,16,17  
        )  
)

Auch der einzeln abgesetzte Query des ELSE-Zweiges tut, wie erwartet, auch wenn das in diesem Beispiel unerheblich ist.

Ich setze mal alles, soweit bekannt in den ersten Query.

SELECT  
  id,  
  parent,  
  pfad,  
  titel  
FROM Struktur  
  WHERE id IN(IF((SELECT parent FROM Struktur WHERE id = 0) = 0,  
    11,12,13,14,15,16,17,  
    (SELECT GROUP_CONCAT(id) AS id FROM Struktur WHERE parent = "[code lang=php]. intval($currentPage['parent']) .
~~~")))  
  ORDER BY sortierer ASC"[/code]  
  
Ich erwarte also die Daten zu den Seiten mit den IDs 11 bis 17 vorzufinden. Ausgegeben wird aber nur der Datensatz für die id 11. Ich stehe nun auf dem Schlauch und weiß nicht weiter. Bin ich mit diesem zugegebenermaßen nicht unkomplizierten Vorgehen vielleicht auf dem Holzweg?  
  
Tschö, Auge  

-- 
Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.  
Terry Pratchett, "Wachen! Wachen!"  
  
ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}  
  
[Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)