Avatar billede JacoDK Nybegynder
07. oktober 2015 - 20:38 Der er 1 løsning

Sortere flere kolonner i Select

Hej Eksperter,

Efter at have søgt nettet igennem i flere timer for en løsning, søger jeg nu hjælp her.

Jeg har følgende query til at hente en mappestruktur/hierarki fra en tabel.

SELECT
    `F`.*,
    NULL AS `FolderTotal`,
    IFNULL(
        SUM(`L`.`TotalLine`),
        0
    ) AS `FolderValue`
FROM
    `ELx_Folder` AS `F`
    LEFT OUTER JOIN (
        SELECT
            `FolderID`,
            `FolderLineTotal`,
            `FolderLineQuantity`,
            SUM(
                `FolderLineTotal` * `FolderLineQuantity`
            ) AS `TotalLine`
        FROM
            `ELx_FolderLine`
        GROUP BY
            `FolderID`
    ) AS `L` ON `L`.`FolderID` = `F`.`FolderID`
GROUP BY
    `F`.`FolderID`
ORDER BY
    `F`.`FolderParentID` IS NOT NULL,
    `F`.`FolderPriority` DESC,
    COALESCE(
        `F`.`FolderID`, `F`.`FolderParentID`
    )


Problemet med min Query er at den ikke sortere rigtig. Øverst i tabellen er alle rækker med FolderParentID NULL, efterfølgende sortere den efter FolderPriority, hvilket er perfekt

MEEEEN nu kommer problemet så:

COALESCE(
        `F`.`FolderID`, `F`.`FolderParentID`
    )

Skulle gerne sortere således at forælderen kommer før barnet.

Jeg håber det er forklaret godt nok, da jeg er ved at blive gråhåret af at finde en løsning :)
Avatar billede JacoDK Nybegynder
14. oktober 2015 - 09:25 #1
Så har jeg fundet løsningen, hvilket i får i uddrag her:

1.) Anvend nedenstående Query, og få PHP Array med forældre og børn
SELECT      `F`.*,      NULL AS `FolderTotal`,      IFNULL(         SUM(`L`.`TotalLine`),          0     ) AS `FolderValue`  FROM `ELx_Folder` AS `F`      LEFT OUTER JOIN (         SELECT              `FolderID`,              `FolderLineTotal`,              `FolderLineQuantity`,              SUM(                 `FolderLineTotal` * `FolderLineQuantity`             ) AS `TotalLine`          FROM              `ELx_FolderLine`          GROUP BY              `FolderID`     ) AS `L` ON `L`.`FolderID` = `F`.`FolderID`  GROUP BY      `F`.`FolderID`  ORDER BY     `F`.`FolderParentID` IS NOT NULL,      COALESCE(         `F`.`FolderParentID`, `F`.`FolderID`     )

2.) Loop igennem og indsæt en sti f.eks. 1/2/3/4
$FolderBuffer[ $item['FolderID'] ]['FolderPath'] .= implode('/', array_filter( array( $FolderBuffer[ $item['FolderParentID'] ]['FolderPath'], $item['FolderParentID'] ) ) );

3.) Loop sti igennem for at lave en træstruktur
if (    !isset(    $FolderOutput[ $ProjectFolderKey ]    ) OR    !is_array(    $FolderOutput[ $ProjectFolderKey ]    )    )
{
$FolderOutput[ $ProjectFolderKey ] = $ProjectFolders[ $ProjectFolderKey ];
}
else
{
$FolderOutput = &$FolderOutput[ $ProjectFolderKey ]['FolderChild'];
}

4.) Sorter træet efter FolderPriority DESC i php uasort
$ordering = array('FolderPriority'=>'DESC');
uasort($FolderOutput, function( $itemA, $itemB ) use ($ordering) { foreach( $ordering AS $colum => $order ){ $direction = (strtolower($order) == 'desc' ? -1 : +1 );  } if ($itemA[$colum] > $itemB[$colum]){ return $direction; } else if ($itemA[$colum] < $itemB[$colum]){ return $direction*-1; } return 0; } );


Koden fylder i alt ca. 76 linjer, og tager 1-5 millisekunder at render i en Unoeuro server :)

Håber det er hjælp nok til andre der sidder med samme problem :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester