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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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