Auge: Problem mit GROUP_CONCAT in Subquery

Beitrag lesen

Hallo

GROUP_CONCAT() liefert einen String zurück. Der wird komplett als ein Parameter von IN() angesehen. Du willst jedoch, dass er als kommaseparierte Liste angesehen wird.
Verständnisfrage: Wenn ich den Query händisch zusammenflicke, ist der betreffende Teil doch auch nur ein String. Was ist hier anders?

Das SQL-Statement wird geparst. Dann wird das Parse-Ergebnis ausgeführt. Der Parser hat nun fertig und dein Kommas enthaltender String, der erst während der Verarbeitung anfällt, bleibt wie er ist. MySQL kann ja auch nicht hellsehen, wann der Autor ein Parsen wünscht und wann das Ergebnis einer Funktion wie es ist weiterverarbeitet werden soll. So bleibt's bei letzterem.

Schade, ich bin halt davon ausgegangen, dass, da die Queries von innen nach außen ausgeführt werden, die Ergebnisse der inneren Queries dem äußeren Query als das, was sie sind (hier ein String mit einer Aufzählung im für IN() korrekten Format), fix und fertig zur Verfügung stehen.

Ich habe das jetzt in zwei Schritten erledigt.

  • Schritt 1: Anhand des bekannten Werts von 'parent' wird mit dem jeweils passenden Query die Werteliste generiert.
# get the items for the sub navigation  
if ($currentPage['parent'] == 0) {  
$queryGetSubNavPrep = "[code lang=sql]SELECT  
  GROUP_CONCAT(id) AS id  
FROM Struktur  
WHERE parent = 
~~~". intval($currentPage['id']);  
} else {  
$queryGetSubNavPrep = "~~~sql
SELECT  
  GROUP_CONCAT(id) AS id  
FROM Struktur  
WHERE parent = 
~~~". intval($currentPage['parent']);  
}[/code]  
  
Das ergibt mit dem Wert [aus dem Eröffnungsposting](https://forum.selfhtml.org/?t=215572&m=1476637) zuverlässig folgende Liste.  
  
~~~php
Array  
(  
    [0] => Array  
        (  
            [id] => 11,12,13,14,15,16,17  
        )  
)

2. Schritt: Das Ergebnis der vorherigen Abfrage wird in den nächsten Query eingefügt.

  
$queryGetSubNav = "[code lang=sql]SELECT  
id,  
parent,  
pfad,  
titel  
FROM Struktur  
WHERE id IN([code lang=php]". $valueSubNavPrep[0]['id'] ."
~~~)  
ORDER by sortierer ASC[/code]";  
[/code]  
  
Das ist zwar um einiges weniger elegant, aber schlussendlich funktioniert es.  
  

> > Mit der normalen Ergebnismenge bin ich ebenfalls gescheitert, da dann (völlig zu recht) angemeckert wird, dass der Subquery mehr als ein Ergebnis zurückgegeben hat (`Subquery returns more than 1 row`{:.language-sql}).  
>   
> Ja, weil das IF() nur einen Parameter und keine Ergebnismenge haben will. IN(SELECT ...) ginge.  
  
jup  
  
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/)