Avatar billede loonitun Juniormester
12. juni 2017 - 15:09 Der er 2 kommentarer

Udvælge Længste og Kortes timestamp i database

Hej

Jeg  har rodet med et problem noget tid og syntes at have set mig godt blind på en løsning.

jeg har nogle kunder. som bestiller noget til produktion, derfor har de en start tid på deres bestilling og en slut tid hvor deres produkt er færdig.

det har jeg lagt i 4 tabeller som ser således ud.

kunde
  kunde_id
  kunde_navn

ordre
ordre_id
ordre_nummer
ordre_kunde_id ( forbindelse til kunde )

stadie
  stadie_id
  stadie_navn

stadie_tid
  stadie_tid_id
  stadie_start
  stadie_slut
  stadie_id ( forbindelse til stadie)
  stadie_ordre_id ( forbindelse til ordre

mit problem er nu at jeg gerne ville have følgende spyttet ud.

Hvilken Ordre som er den næste der er færdig på en valgt kunde.

problemet er at jeg for kun sorteret start og slut på en ordre, men jeg for ikke sorteret den til kun vise den ENE ordre som har den næste slut dato.

jeg har følgende kode.



$j = 0;
$sql_maxtid = "SELECT * FROM Stadie_tid WHERE stadie_slut in (select max(stadie_slut) from Stadie_tid group by ordre_id) group by stadie_slut,ordre_id order by ordre_id asc" ; // vælger ældste timestamp i stadie_tid
$result_maxtid = $conn->query($sql_maxtid);
while($row_maxtid = $result_maxtid->fetch_assoc())
{
    $j ++;
    echo "<br><br><br> loop : " . $j ." : _____________________________________________________________________ <br><br><br>" ;
   
    $OrdreID = $row_maxtid[ordre_id];
   
   
   
    $sql_mintid = "SELECT * FROM Stadie_tid WHERE ordre_id = $OrdreID AND  stadie_start in (select MIN(stadie_start) from Stadie_tid group by ordre_ID) group by stadie_start,ordre_ID order by ordre_ID asc"; // vælger mindste timestamp i stadie_tid
    $result_mintid = $conn->query($sql_mintid);
    while($row_mintid = $result_mintid->fetch_assoc())
    {
       
        $OrdreID = $row_mintid[ordre_Id];
       
        $sql_ordre = "SELECT * FROM `Ordre` WHERE Ordre_id = $OrdreID";
        $result_ordre = $conn->query($sql_ordre);
        while($row_ordre = $result_ordre->fetch_assoc())
        {
           
            $start = date("d F Y H:i:s", $row_mintid[stadie_start]);
            $slut  = date("d F Y H:i:s", $row_mintid[stadie_slut]);
           
            echo "<br>items.add ({";
            echo "<br>Ordreid: " .$row_maxtid[ordre_Id] . ",";
            echo "<br>KundeId: " . $row_ordre[ordre_Kunde_id] . ",";
            echo "<br>content: 'Ordre - " .  $row_ordre[Ordre_nr] . "',";
            echo "<br>start: " .$start . ",";
            echo "<br>end: " .$slut . ",";
            echo "<br>})";
           
        }       
    }
}

som afgiver dette resultat:

loop : 1 : _____________________________________________________________________



items.add ({
Ordreid: 45,
KundeId: 22,
content: 'Ordre - 45',
start: 07 May 2017 06:00:00,
end: 07 May 2017 16:00:00,
})


loop : 2 : _____________________________________________________________________



items.add ({
Ordreid: 47,
KundeId: 23,
content: 'Ordre - 47',
start: 05 May 2017 06:00:00,
end: 05 May 2017 16:00:00,
})


loop : 3 : _____________________________________________________________________



items.add ({
Ordreid: 48,
KundeId: 23,
content: 'Ordre - 48',
start: 01 June 2017 06:00:00,
end: 02 June 2017 16:00:00,
})


loop : 4 : _____________________________________________________________________



items.add ({
Ordreid: 49,
KundeId: 23,
content: 'Ordre - 49',
start: 03 May 2017 06:00:00,
end: 03 May 2017 16:00:00,
})


loop : 5 : _____________________________________________________________________



items.add ({
Ordreid: 50,
KundeId: 23,
content: 'Ordre - 51',
start: 03 May 2017 06:00:00,
end: 03 May 2017 16:00:00,
})


loop : 6 : _____________________________________________________________________



items.add ({
Ordreid: 51,
KundeId: 23,
content: 'Ordre - 50',
start: 02 June 2017 06:00:00,
end: 03 June 2017 16:00:00,
})

og det jeg så gerne ville have haft den til, var kun at vise EN ordre per kunde ID og ikke som her hvor den viser alle ordre, og jeg har simpelthen fået set mig godt blind på løsningen, som sikkert er meget simpel, derfor håber jeg en eller flere her inde kunne komme med en hjælpende hånd :D

p.s

ved det lidt svært at forklare, så hvis det ikke giver mening beklager jeg.

hilsen looni
Avatar billede jetobi Juniormester
15. juni 2017 - 10:55 #1
Hej Loonitun,

Hvilken normalisering af databasen bruger du?

"Hvilken Ordre som er den næste der er færdig på en valgt kunde." Så det betyder selvom produktions tiden måske variere, så skal den altid vælge den som i produktionen er tættest på færdig til den valgte kunde?

Mvh Alexander
https://webstarters.dk/
Avatar billede loonitun Juniormester
16. juni 2017 - 11:29 #2
Hej Alexander.

Det korrekt at den skal vælge den ordre, som er tættest på at være færdig.

mit problem er lige nu den vælger start og slut tid på alle ordre ( og ikke kun den der tættest på at være færdig )

et eksempel på en kunde kunne være

kunde : Bodil
Produkt: ting

"ting" har 5 stadier, som hver har en start tid og en slut tid .

De 5 stadier udgør til sammen Bodils ordre. så jeg har via den kode skrevet tidligere fundet den laveste Start tid og højste slut tid , på den ordre.

det er altsammen fint, men Bodil har nu 5 ordre hos mig, hver med X antal stadier,

min kode spytter derfor alle 5 ordre ud, hvor den fortæller laveste start og højeste slut tid.

Og der kommer mit problem desværre kan jeg ikke vride mit hoved omkring en metode til at sortere så den kun spytter den ene ordre ud som er tættest på leverings tid.

Jeg ved det svært at forstå, for jeg har svært ved at forklare hvad jeg ville. Håber dog det blev lidt mere forståeligt.


jeg har 3 normaliserings form, som jeg har forstået det.

mvh

Nicolai
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