Avatar billede lsskaarup Nybegynder
28. april 2005 - 10:23 Der er 64 kommentarer og
1 løsning

Sortering af MySQL output med "tomme" datoer sidst

Ja, jeg har oprettet dette spørgsmål før, og troede også jeg havde fået det løst, men nu kan jeg se at det ikke virker alligevel. Om det er fordi jeg har slettet noget eller hvorfor ved jeg ikke, men jeg bliver derfor nødtil at oprette spørgsmålet igen.

Jeg har et output fra MySQL, bl.a. med datooplysninger om ordre/tilbud, det er dog ikke alle disse som har en "rigtig" dato, den kan også være NULL eller 0000-00-00. Jeg skal så have dette output sorteret så dem med "rigtige" datoer kommer først i stigende orden, og derefter alle de "forkerte" datoer.

How do I do that?
Avatar billede lsskaarup Nybegynder
28. april 2005 - 11:00 #1
Jeg har nu selv fået det til at gøre det lidt, gad vide hvad forskellen er i forhold til det jeg ikke kunne få til at virke, for jeg synes ikke lige der nogle. Nå men koden:

        while ($foo = mysql_fetch_assoc($sql)) {
            if(empty($foo["projektleder"]) || "" == $foo["levaar"] || "0" == $foo["levaar"]) {
                $tomme[] = $foo;
            } else {
                $med_dato[] = $foo;
            }
            }

        $fool = array_merge($med_dato, $tomme);
        for($i = 0; $i < count($fool); $i++) {

.
.
.
}

Mit problem er nu, at jeg gerne skulle have den gjort specifik, så alt efter om der fra brugeren side bliver sorteret på dato, projektleder e.l. så skal den sortere på samme måde på den valgte og ikke kun ud fra datoen.
Avatar billede jakobdo Ekspert
28. april 2005 - 11:30 #2
Hvad vis du lavede en sql ala: SELECT UNIX_TIMESTAMP(dato) as unix ORDER BY IF(dato = 0,0,1),dato

eller noget i den stil! :o)
Avatar billede apache999 Nybegynder
28. april 2005 - 11:32 #3
Så er det nok selve SQL-forespørgslen, du skal have fat i. Hvis brugen fx kan klikke på følgende links:

<a href="<?echo $_SERVER['PHP_SELF']?>?kriterie=projektleder">projektleder</a>
<a href="<?echo $_SERVER['PHP_SELF']?>?kriterie=levaar">leevar</a>

Så fanger du dem i scriptet således:

$kriterie = $_GET['kriterie'];
$strSQL = "SELECT * FROM dintabel ORDER BY $kriterie";
$foo = mysql_query($strSQL);

Selvfølgelig bliver de så stadig sorteret med din dato-sorter derefter, men indbyrdes er de sorteret efter det valgte kriterie.

tror jeg nok ...
Avatar billede lsskaarup Nybegynder
28. april 2005 - 11:46 #4
Min query ser sådan ud:

$query = "SELECT o.id as id, o.ordre as ordre, o.rev as rev, YEAR(o5.r533c) as levaar,
            WEEKOFYEAR(o5.r533c) as levuge, o0.r1 as projektleder, o0.r9 as kunde, o0.r18 as bygherre, o5.r541,
            o5.r541a, o5.r542, o5.r546, o5.r543, o5.r547, o5.r544, o5.r548, o5.r552,
            WEEKOFYEAR(o5.r555) AS tegnuge, YEAR(o5.r555) AS tegnaar, o5.r572
        FROM ordre AS o, ordre0 AS o0
        LEFT JOIN ordre5 AS o5
        ON o0.tilbudsnummer=o5.tilbudsnummer
        WHERE o0.tilbudsnummer=o.id && (o5.r534=0 || o5.r534 IS NULL) && o5.r534a = 0 $search
        ORDER BY $sort, o.id ASC

$sort er så det som brugeren vælger, eller standard første gang de kommer ind på siden, og det fungere perfekt.

Det jeg skal have tilføjet er en funktionalitet, som gøre at tomme felter sorteres sidst, hvilket jeg så har fået løst ud.

MEN, det skal der jo være... ;-)

jeg skal have sorteret den i flere niveauer. F.eks. vælger brugeren at sortere efter projektleder, er der tilfældigvis en record, som ingen projektleder har, skal den lægges sidst, derudover skal den i næste niveau sortere efter dato, og igen er der datofelter som er tomme skal de også komme sidst, inden for denne projektleder.

Hvis det er til at forstå, jeg tror lige jeg vil prøve at illustrere det.
Avatar billede lsskaarup Nybegynder
28. april 2005 - 11:50 #5
projektleder      dato

dim              12-05-06
dim              13-05-06
dim              14-05-06
dim              15-05-06
dim
kmm              16-05-06
kmm              17-05-06
kmm             
kmm             
hje              18-05-06
hje              19-05-06
hje              20-05-06
hje              21-05-06
                  22-05-06

Bemærk: Projektleder soreteres ikke efter alfabetet med efter deres id i database.
Avatar billede lsskaarup Nybegynder
28. april 2005 - 11:55 #6
Jeg er nået dertil, hvor den sortere enten på projektleder eller dato, alt efter valget, og ligger de tomme sidst. Nu skal jeg bare lige have fundet ud af at kombinere sorteringen ved projektleder. Jeg gør det på denne måde, men kan det ikke gøres smartere, da jeg egentlig vil få en 5-6 if-sætninger, kun til at tjekke sorteringen på.

        while ($foo = mysql_fetch_assoc($sql)) {
            if ($sort == "projektleder asc") {
                if(empty($foo["projektleder"])) {
                            $tomme[] = $foo;
                    } else {
                        $med_dato[] = $foo;
                    }
            } else {
                    if("" == $foo["levaar"] || "0" == $foo["levaar"]) {
                        $tomme[] = $foo;
                    } else {
                          $med_dato[] = $foo;
                }
                }
            }
Avatar billede jakobdo Ekspert
28. april 2005 - 11:57 #7
Prøv at smid din SQL herind?
Man bør kunne lave det via SQL nemlig.
Avatar billede lsskaarup Nybegynder
28. april 2005 - 11:59 #8
Okay, det ville jeg bliver meget glad for, hvis man kan, men den ligge har faktisk.
Kommentar: 28/04-2005 11:46:44
Avatar billede jakobdo Ekspert
28. april 2005 - 12:09 #9
Test lige denne sql:

SELECT
    o.id as id,
    o.ordre as ordre,
    o.rev as rev,
    YEAR(o5.r533c) as levaar,
    WEEKOFYEAR(o5.r533c) as levuge,
    o0.r1 as projektleder,
    o0.r9 as kunde,
    o0.r18 as bygherre,
    o5.r541,
  o5.r541a,
  o5.r542,
  o5.r546,
  o5.r543,
  UNIX_TIMESTAMP(o5.r543) as unix,
  o5.r547,
  o5.r544,
  o5.r548,
  o5.r552,
  WEEKOFYEAR(o5.r555) AS tegnuge,
  YEAR(o5.r555) AS tegnaar,
  o5.r572
FROM
    ordre AS o,
    ordre0 AS o0
LEFT JOIN ordre5 AS o5
ON o0.tilbudsnummer=o5.tilbudsnummer
WHERE
    o0.tilbudsnummer=o.id && (o5.r534=0 || o5.r534 IS NULL) && o5.r534a = 0 $search
ORDER BY IF(unix = 0,1,0),$sort, o.id ASC
Avatar billede lsskaarup Nybegynder
28. april 2005 - 12:14 #10
Den kender ikke unix
Avatar billede lsskaarup Nybegynder
28. april 2005 - 12:18 #11
mærkeligt nok
Avatar billede jakobdo Ekspert
28. april 2005 - 12:49 #12
Hmm, den har jeg da ellers lavet her: UNIX_TIMESTAMP(o5.r543) as unix,

Hvad hvis du måske tester med:
IF((o5.r534 = 0 || o5.r534 IS NULL),1,0),$sort, o.id ASC
Avatar billede lsskaarup Nybegynder
28. april 2005 - 12:51 #13
Ja, men det kunne hverken i query'en eller i phpmyadmin, men med den nye if, kan phpmyadmin godt se den, jeg prøver lige på siden også
Avatar billede lsskaarup Nybegynder
28. april 2005 - 12:53 #14
Hmm, så får jeg slet ikke returneret noget, men den fejler heller ikke
Avatar billede lsskaarup Nybegynder
28. april 2005 - 13:11 #15
hov, jeg havde lige lavet en lille fejl, som var skyld i at intet blev vist. Den sorterer sådan set godt nok, men kun på felt nr. 534. Så det skal vel ændres til projektleder, levuge og levaar som kombineres, og til sidste ordreid
Avatar billede lsskaarup Nybegynder
28. april 2005 - 13:20 #16
Men hvad kan jeg egentlig bruge at den returnere enten 1 eller 0 til?
Avatar billede jakobdo Ekspert
28. april 2005 - 13:22 #17
Jeg kan ikke se det direkte output, så derfor kan jeg ikke rigtigt overskue hvordan en løsning ellers skal være.
Avatar billede lsskaarup Nybegynder
28. april 2005 - 13:24 #18
jeg kan godt prøve at copy/paste et output hvis det kunne hjælpe
Avatar billede lsskaarup Nybegynder
28. april 2005 - 13:25 #19
40321 R1  7-05 KMM Hobro Ny Trælast           
40351  8-05 JRH Harald Holtz Harald Holtz         
40329  9-05 KMM Grønvold & Schous Hans Henning         
40333  9-05 HJE Gråkjær Staldbyg A/S Anders Rasmusse         
40344  9-05 KMM Trælasten Brørup Bøges Trailer o         
40349  9-05 JRH DS Stahl GmbH Cord Hibbing         
40325  10-05 KMM Grønvold & Schous Statoil Raffina         
40335  10-05 LVE Gråkjær Industribyg  Henry D. Nielse         
40338  10-05 LVE Gråkjær Industribyg  HCM Farve- & La         
.
.
.
.
.

Som du kan se sorterer den på dato, selvom der er valgt projektleder
Avatar billede jakobdo Ekspert
28. april 2005 - 14:11 #20
Det jeg ikke forstår er, du har vel et felt som er dato felt?
Eller hvad?
Avatar billede lsskaarup Nybegynder
28. april 2005 - 14:15 #21
Jo, der er mange, næsten alle sammen, men af relevens nok kun r553c, men jeg henter henholdvis årstallet og ugenummeret ud af datoen, for brugeren vil have det vist på den måde. Det er også den som er på "screendumpet" eks. 7-05 -> uge 7 i år 2005
Avatar billede jakobdo Ekspert
28. april 2005 - 14:41 #22
Hvad er det for felter som kan være 0 eller null?
Avatar billede lsskaarup Nybegynder
28. april 2005 - 14:55 #23
Det er bl.a. r533c som kan være null eller 0000-00-00
Avatar billede jakobdo Ekspert
28. april 2005 - 15:05 #24
bl.a.?
Det er de felter som kan indeholde NULL eller 0000-00-00 vi skal lave til unix og så sortere via: IF((o5.r533c = 0 || o5.r533c IS NULL),1,0),$sort, o.id ASC
Avatar billede lsskaarup Nybegynder
28. april 2005 - 15:19 #25
også r555, men får vi det til at virke med, så er 2 nok ikke de store problem, eller hva?
Avatar billede jakobdo Ekspert
28. april 2005 - 15:20 #26
Hvad så med:
IF((o5.r533c = 0 || o5.r533c IS NULL || o5.r555 = 0 || o5.r555 IS NULL),1,0),$sort, o.id ASC
Avatar billede lsskaarup Nybegynder
29. april 2005 - 11:22 #27
Ja, jeg ved ikke helt om det virker, nok fordi jeg får lavet noget rod i php-koden, som hiver data ud. Jeg poster lige min kode indtil videre, hvor jeg pt. ikke for returneret noget som helst. Der er en masse udkommenteret kode, som er fra den jeg via php prøvede at ændre sorteringen.
Avatar billede lsskaarup Nybegynder
29. april 2005 - 11:24 #28
while ($foo = mysql_fetch_assoc($sql)) {
/*            if ($sort == "projektleder asc") {
                if(empty($foo["projektleder"])) {
                    if("" == $foo["levaar"] || "0" == $foo["levaar"]) {
                            $tomme_proj[] = $foo;
                        } else {
                              $med_dato_proj[] = $foo;
                    }
                    } else {
                    if("" == $foo["levaar"] || "0" == $foo["levaar"]) {
                            $tomme[] = $foo;
                        } else {
                              $med_dato[] = $foo;
                    }
                    }
            } else {
                    if("" == $foo["levaar"] || "0" == $foo["levaar"]) {
                        $tomme[] = $foo;
                    } else {
                          $med_dato[] = $foo;
                }*/
                //}
            }

//        $fool = array_merge($med_dato, $tomme);
//        $fool = array_merge($uden_proj, $fooli);

//        $fool2 = array_merge($med_dato_proj, $tomme_proj);
//        $fool1 = array_merge($tomme, $fool2);
//        $fool = array_merge($med_dato, $fool1);

        for($i = 0; $i < count($foo); $i++) {
            //$foo = $foo[$i];
            $ntal = $i%2;
            $farve="";
            $farve2="";
            if ($ntal==0){
                $farve = "bgcolor=\"#F2F2F2\"";
            } else {
                $farve2 = "bgcolor=\"#F2F2F2\"";
            }
?>

Herefter skriver jeg de forskellige data ud
Avatar billede jakobdo Ekspert
29. april 2005 - 21:54 #29
Jeg vil meget gerne hjælpe, men ville meget gerne se dine data live, hvis det er muligt!
Du kan evt prøve at fange mig på MSN: jakobdo (-at-) hotmail (-dot-) com
Avatar billede lsskaarup Nybegynder
30. april 2005 - 23:30 #30
Hvis du mener, en offentlgi tilgængelig hjemmeside, så er det desvære ikke muligt.
Avatar billede lsskaarup Nybegynder
03. maj 2005 - 11:11 #31
Men jeg kan da eventuelt sende et screendump, hvis jeg må?
Avatar billede jakobdo Ekspert
03. maj 2005 - 11:37 #32
Ja, hvis jeg på en eller anden måde kunne se hvordan du har dine data gemt i dag!
Det er svært at se ud fra din sql, som er meget større end hvad jeg plejer at rode med! :o)
Avatar billede lsskaarup Nybegynder
03. maj 2005 - 11:53 #33
Fint, så får jeg lige lavet en billede til dig.

Selve data, kan/må jeg ikke vise dig, men opbygningen kan jeg da prøve at forklare. Det skal dog siges, at det ikke er mig som har opbygget db'en i tidernes morgen, og derfor heller ikke har det direkte fra "opfinderens" mund, hvorfor han har valgt at gøre på denne måde, men kun hvad jeg sådan har kunnet gætte mig til.

Men selve datastrukturen, er sådan set spredt over er 7 tabeller, i dette tilfælde ordre og ordre0-5, men det er også sådan for et tilbud. Ordre holder styr på id kontra ordrenr, oprettelsesdato, status og lignede ting. Ordre0 - 5 indeholder så data fra alle felter på ordren. Alle felter er nummeret, hvilket sikkert også har skabt tabelopbygningen, da alle 0-100 ligger i ordre0, alle 101-200 i ordre1 osv...

Det er også derfor jeg joiner, for at få samlet de oplysninger i et resultat, som jeg nu en gang skal bruge.

$search i queryen er en parameter, hvis brugeren vil søge efter f.eks. en bestemt oprettelsesdato, $sort er så sorteringen, som brugeren kan vælge ved at klikke på nogle kolonneoverskrifter, og det er altså så her, de godt vil have, at ordre som har en tom dato (bl.a. kunne det være den ikke være udfyldt endnu) bliver sorteret til sidst. Det fik vi sådan set også til at virker, MEN, for det skal der jo være ;-), de vil gerne have, at hvis de vælger at sortere på f.eks. projektleder, så skal der inden for hver projektleder soreteres efter dato og igen med de tomme til sidst.
Avatar billede jakobdo Ekspert
03. maj 2005 - 11:57 #34
Den query som gider dig:

40321 R1  7-05 KMM Hobro Ny Trælast         
40351  8-05 JRH Harald Holtz Harald Holtz       
40329  9-05 KMM Grønvold & Schous Hans Henning       
40333  9-05 HJE Gråkjær Staldbyg A/S Anders Rasmusse       
40344  9-05 KMM Trælasten Brørup Bøges Trailer o       
40349  9-05 JRH DS Stahl GmbH Cord Hibbing       
40325  10-05 KMM Grønvold & Schous Statoil Raffina       
40335  10-05 LVE Gråkjær Industribyg  Henry D. Nielse       
40338  10-05 LVE Gråkjær Industribyg  HCM Farve- & La   

Må da kunne sorteres efter datofeltet?
Avatar billede lsskaarup Nybegynder
03. maj 2005 - 12:03 #35
Selvfølgelig kan jeg sortere på datofelter, men så kommer de tomme jo først. Den som du nævner, bliver efter query via dit script ændret, så de tomme kommer til sidst. Det virker altså bare ikke helt når jeg gerne vil sortere f.eks. på projektleder.

Har forresten sendt din en mail.
Avatar billede jakobdo Ekspert
03. maj 2005 - 12:05 #36
Det er vel "bare" at skrive:
ORDER BY $sort,IF((o5.r534 = 0 || o5.r534 IS NULL),1,0)
Avatar billede lsskaarup Nybegynder
03. maj 2005 - 12:07 #37
Åbenbart ikke helt, for den gør det ikke.

Queryen ser nu sådan ud:

SELECT o.id as id, o.ordre as ordre, o.rev as rev, YEAR(o5.r533c) as levaar,
    WEEKOFYEAR(o5.r533c) as levuge,
    o0.r1 as projektleder,
    o0.r9 as kunde,
    o0.r18 as bygherre,
    o5.r541,
  o5.r541a,
  o5.r542,
  o5.r546,
  o5.r543,
  UNIX_TIMESTAMP(o5.r543) as unix,
  o5.r547,
  o5.r544,
  o5.r548,
  o5.r552,
  WEEKOFYEAR(o5.r555) AS tegnuge,
  YEAR(o5.r555) AS tegnaar,
  o5.r572,
  o5.r573,
  o5.r574,
  o5.r575
FROM
    ordre AS o,
    ordre0 AS o0
LEFT JOIN ordre5 AS o5
ON o0.tilbudsnummer=o5.tilbudsnummer
WHERE
    o0.tilbudsnummer=o.id && (o5.r534=0 || o5.r534 IS NULL) && o5.r534a = 0
ORDER BY $sort, IF((o5.r533c = 0 || o5.r533c IS NULL || o5.r555 = 0 || o5.r555 IS NULL),1,0), o.id ASC

Men hov, kan det være fordi jeg stadig i scriptet splittet det andre på dato. Det må jeg lige tjekke ud.
Avatar billede lsskaarup Nybegynder
03. maj 2005 - 12:11 #38
Okay, det tror jeg vidst det var, tjekker lige videre.
Avatar billede lsskaarup Nybegynder
03. maj 2005 - 12:22 #39
Okay, det var derfor, og så skal jeg bare have ændret alle sorteringsparameterne i query til IF(.....), men hvordan fungere den egentlig?
Avatar billede jakobdo Ekspert
03. maj 2005 - 12:40 #40
Nej, du skal kun bruge if, der hvor du tjekker om en dato er tom eller ej!
Resten lader du bare være som du allerede har det.
Avatar billede lsskaarup Nybegynder
03. maj 2005 - 14:48 #41
Ahhh, jeg har nogle enkelte andre felter som også kan være tomme, så de skal nok også have den på, men jeg lader lige spørgsmålet stå åbent, da der faktisk er mange steder jeg skal have tilpasset til denne sortering. Så der kommer nok nogle problemer af en eller naden form.
Avatar billede lsskaarup Nybegynder
04. maj 2005 - 14:58 #42
Øh, jeg har et tekstfelt, som jeg ikek lige synes jeg kan lave vede IF(). Hvordan skal den være ?

Jeg har bl.a. prøvet IF((bygherre = ""),1,0) og diverse kombinationer deraf.
Avatar billede jakobdo Ekspert
05. maj 2005 - 22:23 #43
Hvis dine tekstfelter er tomme, er de så ikke NULL?
Eller er de ""?
Avatar billede lsskaarup Nybegynder
06. maj 2005 - 00:02 #44
De skulle sådan set kunne være begge dele. NULL når der endnu ikke er skrevet til dem, og eventuelt en tom streng også. Men jeg har prøvet med begge muligheder, og synes ikke rigtigt den fanger dem.
Avatar billede lsskaarup Nybegynder
06. maj 2005 - 09:57 #45
Jeg har nu fået løst problemet med bygherre, men det er ikke en god løsning, så hvis du har en anden og bedre, så kom endelig med det.

Mit problem var, at jeg på et link via onClick, sætte sorteringen. Og det jeg gerne ville have, var at den så sådanne ud:
onClick="return setSort('IF((o0.r18 = "")1,0)');"

Jeg kan godt escape "", så siden kan loades under problemer, men så forstår queryen, den ikke for pludselig, står der \"\" i den, og det er den ikke glad for.

Min løsning nu er, at jeg sætter sorteringen lig bygherre, og så i script når siden loadesm tjekke på om setSort er lig bygherre. er den det laver jeg querydelen som jeg vil have den, og det virker.

onClick="return setSort('bygherre');"

script:
if (isset($_POST['sort'])) {
        if ($_POST['sort'] == bygherre)    {
            $sort = "IF((o0.r18 = ''),1,0), IF((o5.r533c = 0 || o5.r533c IS NULL),1,0), o.id ASC";
        } else {
            $sort = $_POST['sort'];
        }
    }

Det er bare mange, der skal laves på denne måde, og jeg synes ikke det er helt holdbart, hvis jeg kigger ud i fremtiden, og en anden skal rette koden.

Så jakobdo, har du en løsning, så querydelen kan stå direkte i setSort, så hverken siden eller selve forespørgelsen fejler?
Avatar billede jakobdo Ekspert
06. maj 2005 - 11:28 #46
Jeg forstår ikke helt dit spørgsmål her til sidst.
Mener du en måde at lave forskellige sorts?

Hvis ja, så kunne du evt bruge:

switch($_POST['sort'])
{
  case "bygherre":
    $sort = "IF((o0.r18 = ''),1,0), IF((o5.r533c = 0 || o5.r533c IS NULL),1,0), o.id ASC";
    break;
  case "dato":
    $sort = "IF((o5.r533c = 0 || o5.r533c IS NULL || o5.r555 = 0 || o5.r555 IS NULL),1,0), o.id ASC";
    break;
  default:
    $sort "et eller andet som bare er standard";

}
Avatar billede lsskaarup Nybegynder
06. maj 2005 - 11:49 #47
Du skal forestille dig kolonneoverskrifterne i links, som sætter sorteringen. Klikker brugeren på "bygherre", så skal query-output sorteres, så først kommer de ordre som har en bygherre, derefter dem som ikke har. Er bygherren ens (lige meget om den er udfyldt eller tom), skal den efterfølgende sortere på en leveringsdato.

Det har jeg løst, men kunne godt tænke mig en løsning, som lignede originalkoden mere. Oprindelig bliver $_POST['sort'] ved onClick sat lig med de forskellige $sort varibler.

Men jeg er løbet på endnu et problem, det mærkelige er at når jeg går videre, til næste kolonne, hvor datamuligherne er 1, 0 og NULL, så kan jeg odt få den til at sortere 1'erne først, men den vil sgu ikke sortere på datoen, selvom koden er ens...?
Avatar billede lsskaarup Nybegynder
06. maj 2005 - 11:50 #48
Se selv:

if ($_POST['sort'] == bygherre)    {
            $sort = "IF((o0.r18 = ''),1,0), IF((o5.r533c = 0 || o5.r533c IS NULL),1,0), o.id ASC";
        } else if ($_POST['sort'] == OBsendt) {
            $sort = "IF((o5.r572 = 1),0,1), IF((o5.r533c = 0 || o5.r533c IS NULL),1,0), o.id ASC";
        } else if ($_POST['sort'] == special) {
            $sort = "IF((o5.r541 = 1),0,1), IF((o5.r533c = 0 || o5.r533c IS NULL),1,0), o.id ASC";
        }
Avatar billede lsskaarup Nybegynder
06. maj 2005 - 12:04 #49
Rettelse r572 skulle have været r542 før.

Hvis jeg skralder queryen til kun at vise id, r542 og r533c, så virker det som om der er en sortering efter id, som overrider den anden IF-sætning, kan det passe, det burde da ikke ske?
Avatar billede lsskaarup Nybegynder
06. maj 2005 - 13:05 #50
Hmm, jeg ser nu at bygherre heller ikke virker optimalt. Godt nok deles sorteringen op i 2. Dem med en bygherre og dem uden, men dem med en bygherre, må eventuelt gerne blive sorteret alfabetisk først, med i det mindste skal den sortere dem på leveringsdato og ikke ordre.id, som den ellers gør.
Avatar billede jakobdo Ekspert
06. maj 2005 - 16:52 #51
Kunne du ikke lave din sort på denne måde:

switch($_GET['sort'])
{
    case "bygherre":
        $sort = "IF((o0.r18 = ''),1,0), IF((o5.r533c = 0 || o5.r533c IS NULL),1,0), o.id ASC";
        break;
       
    case "OBsendt":
        $sort = "IF((o5.r572 = 1),0,1), IF((o5.r533c = 0 || o5.r533c IS NULL),1,0), o.id ASC";
        break;
   
    case "special":
        $sort = "IF((o5.r541 = 1),0,1), IF((o5.r533c = 0 || o5.r533c IS NULL),1,0), o.id ASC";
        break;
   
    default:
        $sort = "o.id ASC";
}
Avatar billede lsskaarup Nybegynder
06. maj 2005 - 21:46 #52
Jeg har ikke forsøgt med breaks, kun if-sætninger. Men de fanger godt nok, det er selve $sort der ikke kører som den skal, så jeg tror ikke break vil gøre nogen sønderlig forskel, men jeg vil da prøve på mandag.
Avatar billede jakobdo Ekspert
07. maj 2005 - 00:19 #53
Breaks, gør ikke noget ved selve din søgning.
Den ændre bare måden at stille det op på! (og så er det pænere end if, elseif osv...)
Men jeg tror snart jeg giver op hvordan dine sql'er skal laves!
Jeg er slet ikke med på hvordan din database struktur er!
Jeg tror desværre jeg giver op, men jeg håber du har fået lidt ideer du kan bruge til en brugbar løsning.
Avatar billede lsskaarup Nybegynder
09. maj 2005 - 09:08 #54
Hvis det bare selve strukturen du er i tvivl om, så er faktisk ikke så mærkelig, og så lidt alligevel. Langt de fleste felter er som udgangspunkt "Tinytext". Grunden hertil må stå hen i det uvisse, men kan måske skyldes, at den første udvikler ikke havde fået en ordentlig info. om data som skulle gemmes.

Nå men jeg tager kun de felter som skal bruges i forespørgelsen, da det ville bliver for uoverskueligt andet.

Struktur:
Ordre
-----
felt - datatype - nulværdi - standardværdi
id - mediumint(8) - nej -
ordre - do - nej - 0
rev - smallint(5) - nej - 0

ordre0:
tilbudsnummer - mediumint(8) - ja - NULL
r9 - tinytext - ja - NULL
r1 - tinytext - ja - NULL
r18 - tinytext - ja - NULL

ordre5:
r533c - date - nej - 0000-00-00
r534 - tinytext - ja - NULL
r534a - tinytext - nej
r541 - tinytext - ja - NULL
r541a - tinytext - ja - NULL
r542 - tinytext - ja - NULL
r543 - tinytext - ja - NULL
r544 - tinytext - ja - NULL
r546 - tinytext - ja - NULL
r547 - tinytext - ja - NULL
r548 - tinytext - ja - NULL
r552 - tinytext - ja - NULL
r555 - tinytext - ja - NULL
r572 - tinytext - ja - NULL
r573 - tinytext - ja - NULL
r574 - tinytext - ja - NULL
r575 - tinytext - ja - NULL

Håber det kan hjælpe lidt, og så komemr jeg lige med et indlæg over hvilke felter, som jeg gerne vil have sortere specielt.
Avatar billede lsskaarup Nybegynder
09. maj 2005 - 09:33 #55
Standard:
Når brugeren lige kommer ind på siden, skal der sorteres efter r533c, så den førstkommende dato står øverst, og eventuelle ordre med datoer med 0000-00-00 står sidst. Er der ordre med samme dato, skal de sorteres stigende efter id.

Ordrenr:
Ja, den er ikek det store problem, skal kun sortere på ordreid, og der er ingen tomme.

Leveringstid:
Lige som standard.

Projektleder:
Skal sortere på r1, som faktisk er deres id-nummer, igen ordre uden projektleder til sidst. Når flere ordre, har samme projektleder, skal der sorteres efter standard, altså først r533 og så id.

Kunde:
Sortering på r9, igen med tomme til sidst, efterfølgende standard.

Bygherre:
Sortering på r18, igen med tomme til sidst, efterfølgende standard.

Resten vil næsten køre over samme princip.

Ordrebekræftelse sendt:
Sortering på r572, igen med tomme til sidst, efterfølgende standard.

Special stål bestilt:
Sortering på r541, først records med JA, så NEJ, og til sidst tomme. Efterfølgende igen standard.

Klar til statik:
Sortering på r542, igen med tomme til sidst, efterfølgende standard.

Statik regnet:
Sortering på r546, igen med tomme til sidst, efterfølgende standard.

Klar til optegnelse:
Sortering på r543, igen med tomme til sidst, efterfølgende standard.

Sendt til godkendelse:
Sortering på r547, igen med tomme til sidst, efterfølgende standard.

Godkendt af kunde:
Sortering på r544, igen med tomme til sidst, efterfølgende standard.

Ordrebekræftelse retur:
Sortering på r548, igen med tomme til sidst, efterfølgende standard.

Kreditvurdering OK:
Sortering på r552, igen med tomme til sidst, efterfølgende standard.

Leveringsuge på tegn.sæt:
Sortering på r555, igen med tomme til sidst, efterfølgende standard.

Intern statik / produktionstegning / produktion:
Denne bliver måske noget voldsom, da den samlet 3 felter i én kolonne. Statik er felt r373, produktionstegning er r374 og produktion er r375, og de skal sorteres på følgende måde:
-------------
| S | T | P |
-------------
| x | x | x |
-------------
|  | x | x |
-------------
| x | x |  |
-------------
| x |  | x |
-------------
|  |  | x |
-------------
|  | x |  |
-------------
| x |  |  |
-------------
|  |  |  |
-------------
x er dem som indeholder data.

Igen efterfølgende, når der er ordre, som er ens, skal de sorteres som standard, hvis det er muligt.
Avatar billede lsskaarup Nybegynder
09. maj 2005 - 10:29 #56
Hov, jeg lavede lige nogle fejl. Først "Special stål", der skal tjekkes på både felt r541 og r541a,

er r541 = 1 og r541a = 0, er der bestilt stål.
Er det modsat er der ikke bestilt stål.
Er ingen af dem udfyldt, ja, så har brugeren endnu ikke fortaget valget.

Den anden fejl er ved de 3 interne felter. Der skrev jeg r3xx, men det skulle have været r5xx.
Avatar billede jakobdo Ekspert
09. maj 2005 - 19:06 #57
Jeg har her forsøgt at lave et eksempel, kan det bruges:

$sort        = "ORDER BY ";
$ordrenr      = "o.id ASC";
$standard    = "IF((o5.r533c = 0 || o5.r533c IS NULL),1,0), ASC" . $ordrenr;
$projektleder = "IF((o0.r1 = '' || o0.r1 IS NULL),1,0), ASC";
$kunde        = "IF((o0.r9 = '' || o0.r9 IS NULL),1,0), ASC";
$bygherre    = "IF((o0.r18 = '' || o0.r18 IS NULL),1,0), ASC";

switch($_POST['sort'])
{
    case "ordrenr":
        $sort .= $ordrenr;
        break;
   
    case "projektleder":
        $sort .= $projektleder . " " . $standard;
        break;
   
    case "kunde":
        $sort .= $kunde . " " . $standard;
        break;
   
    case "bygherre":
        $sort .= $bygherre . " " . $standard;
        break;
   
    default:
        $sort .= $standard;
}
Avatar billede jakobdo Ekspert
09. maj 2005 - 19:06 #58
Det er kun de første 5 sorteringsmuligheder...
Resten burde dog være ligetil.
Avatar billede jakobdo Ekspert
09. maj 2005 - 19:46 #59
$sort                = "ORDER BY ";
$ordrenr            = "o.id ASC";
$standard            = "IF((o5.r533c = 0 || o5.r533c IS NULL),1,0), ASC" . $ordrenr;
$projektleder        = "IF((o0.r1 = ''  || o0.r1 IS NULL)  ,1,0), ASC";
$kunde              = "IF((o0.r9 = ''  || o0.r9 IS NULL)  ,1,0), ASC";
$bygherre            = "IF((o0.r18 = ''  || o0.r18 IS NULL)  ,1,0), ASC";
$ordrebekraeftelse  = "IF((o5.r572 = '' || o5.r572 IS NULL) ,1,0), ASC";
$specialstaal        = "IF((o5.r541 = 1  && o5.r541a = 0)    ,1,0), ASC";
$klarstatik          = "IF((o5.r542 = '' || o5.r542 IS NULL) ,1,0), ASC";
$regnetstatik        = "IF((o5.r546 = '' || o5.r546 IS NULL) ,1,0), ASC";
$klaroptegnelse      = "IF((o5.r543 = '' || o5.r543 IS NULL) ,1,0), ASC";
$sendttilgodkendelse = "IF((o5.r547 = '' || o5.r547 IS NULL) ,1,0), ASC";
$godkendtkunde      = "IF((o5.r544 = '' || o5.r544 IS NULL) ,1,0), ASC";
$ordreberetur        = "IF((o5.r548 = '' || o5.r548 IS NULL) ,1,0), ASC";
$kreditok            = "IF((o5.r552 = '' || o5.r552 IS NULL) ,1,0), ASC";
$leveringsuge        = "IF((o5.r555 = '' || o5.r555 IS NULL) ,1,0), ASC";

switch($_POST['sort'])
{
    case "ordrenr":
        $sort .= $ordrenr;
        break;
   
    case "projektleder":
        $sort .= $projektleder . " " . $standard;
        break;
   
    case "kunde":
        $sort .= $kunde . " " . $standard;
        break;
   
    case "bygherre":
        $sort .= $bygherre . " " . $standard;
        break;
   
    case "ordrebekraeftelse":
        $sort .= $ordrebekraeftelse . " " . $standard;
        break;
   
    case "specialstaal":
        $sort .= $specialstaal . " " . $standard;
        break;
   
    case "klarstatik":
        $sort .= $klarstatik . " " . $standard;
        break;
   
    case "regnetstatik":
        $sort .= $regnetstatik . " " . $standard;
        break;
   
    case "klaroptegnelse":
        $sort .= $klaroptegnelse . " " . $standard;
        break;
   
    case "sendttilgodkendelse":
        $sort .= $sendttilgodkendelse . " " . $standard;
        break;
   
    case "godkendtkunde":
        $sort .= $godkendtkunde . " " . $standard;
        break;
       
    case "ordreberetur":
        $sort .= $ordreberetur . " " . $standard;
        break;
   
    case "kreditok":
        $sort .= $kreditok . " " . $standard;
        break;
   
    case "leveringsuge":
        $sort .= $leveringsuge . " " . $standard;
        break;
   
    default:
        $sort .= $standard;
}

Jeg sad lige og kedede mig, så lavede næsten resten.

Intern Statik springer jeg over.
Forstår ikke helt hvordan du vil sortere der.

Men håber du kan bruge det her.
Avatar billede lsskaarup Nybegynder
11. maj 2005 - 13:21 #60
Hov havde slet ikke set du havde lagt et indlæg, jeg tester den lige.

Intern er også lidt tricky, da der er 3 felter, som bliver vist samlet. Der er der bestemt, at når alle 3 er sat skal de sorteres øverste, dernæst når 2 er sat, og til sidst kun 1 er sat.
Avatar billede lsskaarup Nybegynder
11. maj 2005 - 13:33 #61
Jo jo, nu tror jeg den er ved at være der.

Jeg testede lige med bygherre, og godt nok måtte jeg ændre
IF((o0.r18 = ''  || o0.r18 IS NULL)  ,1,0), ASC
til
IF((o0.r18 = ''  || o0.r18 IS NULL)  ,1,0), o0.r18 ASC
for ikke at få en sql-fejl, men så kommer alle bygherrene alfabetisk, og med de tomme til sidst. Fjernede jeg ASC i din, bliver de ikke sorteret alfabetisk.

Jeg løber lige igennem og se om det virker for den andre også, plus de lidt mere specielle sorteringer.
Avatar billede lsskaarup Nybegynder
11. maj 2005 - 14:04 #62
Yes, med lidt tilpasninger virker det nu, så mangler jeg bare den specielle med intern, men lige netop til den har jeg oprettet et nyt spørgsmål idag.

Tak for hjælpen, og så giver jeg lidt ekstra point, fordi du alligevel hang på.

Så hvis du vil lægge et svar.
Avatar billede lsskaarup Nybegynder
11. maj 2005 - 14:07 #63
Hvis du vil være med på det nye spørgsmål, så har jeg oprettet det under MySQL, hvor dette egentlig vel også skulle være.

http://eksperten.dk/spm/616810
Avatar billede jakobdo Ekspert
11. maj 2005 - 18:01 #64
Svar...
Avatar billede jakobdo Ekspert
13. maj 2005 - 09:24 #65
Tak for point!
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