2 x group by in einer Tabelle

gefcon

Neuer Benutzer
Beiträge
3
Hallo, ich versuche eine query zu schreiben, bei der jeder Eintrag der paths Tabelle mit den "internen Schlüsseln" level_id und style_id gruppiert werden soll. Das Ergebnis soll dann in etwa so aussehen:

paths:
id, level_id, style_id, line, fill, stroke, sort_order

PHP:
Array(
    [0] => Array( //level_id (Hauptgruppe)
        [0] => Array( //style_id (Untergruppe)
            [0] => Array( // fields (Einträge)
                [id]
                [line]
                [fill]
                [stoke]
                [sort_order]
            ),
            [1] => Array(
                [id] ...
        )
    )
)

Das Problem ist nun, dass ich nur ein ergebnis pro Gruppe und nicht die gewünschte Strukturierung hinbekomme ... bisher sieht die query so aus:
Code:
SELECT `Path`.`id`, `Path`.`line`, `Path`.`fill`, `Path`.`stroke`, `Path`.`sort_order`
FROM `TABLE`.`paths` AS `Path`
LEFT JOIN `TABLE`.`levels` AS `Level`
ON (`Path`.`level_id` = `Level`.`id`)
LEFT JOIN `TABLE`.`styles` AS `Style`
ON (`Path`.`style_id` = `Style`.`id`)
WHERE 1 = 1
GROUP BY `Level`.`id`, `Style`.`id`

Ergebnis:
Code:
Array
(
    [0] => Array
        (
            [Path] => Array
                (
                    [id] => 1
                    [line] =>...
                    [fill] => #ffffff
                    [stroke] => none
                    [sort_order] => 1
                )

        )

    [1] => Array...

Ich wäre wirklich sehr froh wenn mir jemand bei dem Problem auf die Sprünge helfen könnte. LG
 
Werbung:
Also mit deinem PHP kann ich dir nicht helfen aber deine SQL Syntax ist fehlerhaft. Ich bin mir nicht ganz sicher ob du von der GROUP BY-Funktionalität die selbe Vorstellung hast. GROUP BY liefert immernoch eine Tabelle und keine Form von "Unterteilungen" oder ähnliches. Die gruppierten Spalten stehen normalerweise mit im Select, also auch `Level`.`id` und `Style`.`id`. Alle übrigen Spalten (alles was nicht im GROUP BY steht) müssen aggregiert werden mit Funktionen wie z.B. sum(), min(), max(), avg(), etc.
 
Vielen Dank für die Antwort.

Vielleicht versuche ich es in der nächsten Zeit mal mit stored procedures aber mit php funktioniert es auch.
 
Werbung:
Ja, wahrscheinlich sollte man sowas nicht mit sql etc. realisieren... so habe ich es in PHP geschrieben. Dachte nur dass es eventuell eine direktere Möglichkeit gibt die Daten in der Form aufzubereiten aber so funktioniert es auch bestens.

Code:
$paths => SELECT `Path`.`id`, `Path`.`level_id`, `Path`.`style_id`, `Path`.`line`, `Path`.`fill`, `Path`.`stroke`, `Path`.`sort_order` FROM `Table`.`paths` AS `Path` LEFT JOIN `DB`.`levels` AS `Level` ON (`Path`.`level_id` = `Level`.`id`) LEFT JOIN `Table`.`styles` AS `Style` ON (`Path`.`style_id` = `Style`.`id`) WHERE 1 = 1

PHP:
$level1 = array();
$level2 = array();
$level3 = array();
$level4 = array();
$level5 = array();
$level6 = array();

foreach($paths as $key => $item){
     switch($item['Path']['level_id']){
         case 1:
            $temp = array();
            $temp[$item['Path']['style_id']-1] = $item['Path'];
            array_push($level1, $temp);
            break;
        case 2:
            $temp = array();
            $temp[$item['Path']['style_id']-1] = $item['Path'];
            array_push($level2, $temp);
            break;
        case 3:
            $temp = array();
            $temp[$item['Path']['style_id']-1] = $item['Path'];
            array_push($level3, $temp);
            break;
        case 4:
            $temp = array();
            $temp[$item['Path']['style_id']-1] = $item['Path'];
            array_push($level4, $temp);
            break;
        case 5:
            $temp = array();
            $temp[$item['Path']['style_id']-1] = $item['Path'];
            array_push($level5, $temp);
            break;
        case 6:
            $temp = array();
            $temp[$item['Path']['style_id']-1] = $item['Path'];
            array_push($level6, $temp);
            break;
     }
}
$result = array($level1, $level2, $level3, $level4, $level5, $level6);
 
Zurück
Oben