Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbank mit Kurieraufträgen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbank mit Kurieraufträgen

    Hallo zusammen,

    ich hänge vor (für mich) einem großen Problem. Ich habe eine Datenbank mit Kurieraufträgen, diese Daten werden mittels einer CSV Datei importiert (auf diese habe ich aber keinen Einfluss). Das ist mein Ausgangspunkt:

    Tabelle:
    orders

    Felder:
    id
    date
    time
    art
    details
    destination
    customer
    order_number

    Mein Problem ist jetzt, dass ein Auftrag zweimal vorkommen kann. Es gibt vier mögliche Varianten:

    1. Pickup
    2. Delivery
    3. Change_Pick
    3. Change_Del

    Sollte ein Auftrag bei einem Kunden abgeholt werden und zu einem anderen gebracht gibt es den Auftrag 1234 einmal mit dem Status Change_Pick um 13:22 Uhr und einmal den Auftrag 1234 mit dem Status Change_Del um 15:10 Uhr.

    Jetzt möchte ich aber, dass für jeden Auftrag ein DIV angezeigt wird.

    Auftrag 1232
    ABHOLEN: 14:33


    Auftrag 1233
    ÜBERGEBEN: 17:33


    Auftrag 1234
    ABHOLEN: 13:22
    ÜBERGEBEN: 15:10

    Das bekomme ich aber so gar nicht hin. Bisher habe ich eine einfache SELECT Abfrage, die mir alle Aufträge anzeigt.

    Vielen Dank im voraus.

  • #2
    Du kannst du dir den letzten Auftrag ausgeben lassen mit der letzten Änderung
    Code:
    Select
        id
        date
        time
        art
        details
        destination
        customer
        order_number
    From
        mytable
    ORDER BY
        date DESC, time DESC
    Limit 1;
    oder alle Einträge zu diesem Auftrag
    Code:
    Select
        id
        date
        time
        art
        details
        destination
        customer
        order_number
    From
        mytable
    WHERE
        order_nr = 1234
    ORDER BY
        date DESC, time DESC;
    Wenn du Mysql verwendest setze noch `Backticks` um die Spaltennamen und den Tabellennamen.
    Nebenbei bemerkt solltest du dich unbedingt mit den Grundlagen zu SQL beschäftigen.



    Kommentar


    • #3
      Zitat von ds160384 Beitrag anzeigen
      Ich habe eine Datenbank mit Kurieraufträgen, Das ist mein Ausgangspunkt:

      Tabelle:
      orders

      Felder:
      id
      date
      time
      art
      details
      destination
      customer
      order_number

      Mein Problem ist jetzt, dass ein Auftrag zweimal vorkommen kann. Es gibt vier mögliche Varianten:

      1. Pickup
      2. Delivery
      3. Change_Pick
      3. Change_Del

      Jetzt möchte ich aber, dass für jeden Auftrag ein DIV angezeigt wird.
      ..
      Wie immer, präzise Angaben sind der erste Schritt zur Lösung.
      Du schreibst was von "Auftr", zu welchem der dargestellten Felder gehört das?
      Eine Anzeige im DIV oder sonstwo hat nichts mit den Daten darunter oder wie Du dran kommst zu tun.

      Grob verstanden: Du möchtest zu einer Auftragsnummer 2 Werte anzeigen (die aus verschiedenen Zeilen zusammenzusetzen sind)
      genauer:
      Ist nur ein Wert vorhanden, dann natürlich nur einen
      Bei 2 Werten, erst den älteren, dann den jüngeren?

      Ansatz:
      Code:
      Select order_number as Auftr, art, .. from Orders
      Order by order_number,  date, time
      Das liefert Deine sortierten Ausgabedaten.

      Um sie wie gewünscht in DIV zu packen, musst Du die Menge durchlaufen und immer bei doppelten Vorkommen der Order_Number den 2. Wert mit in das gleiche DIV reinnehmen.
      Wäre eine Möglichkeit.


      Kommentar


      • #4
        eine andere: z.B. in einem JSON-Array aggregieren (DB-seitig). Immerhin sind wir ja in der Datenbank-Gruppe ...
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Zitat von Perry Staltic Beitrag anzeigen
          Grob verstanden: Du möchtest zu einer Auftragsnummer 2 Werte anzeigen (die aus verschiedenen Zeilen zusammenzusetzen sind)
          genauer:
          Ist nur ein Wert vorhanden, dann natürlich nur einen
          Bei 2 Werten, erst den älteren, dann den jüngeren?
          Ich tippe auch auf ein Pivot-Problem. Kann auch komplett mit SQL gelöst werden. s. Gruppieren und Gruppenelemente mit in der Zeile ausgeben.

          Die Pivotierung kann aber auch im Anschluss eines einfachen Selects auf PHP-Seite realisiert werden. Die PHP Klasse tableArray hat eine pivot-Methode.
          Ob die Methode für das Problem hier ausreicht käme auf einen Versuch an.

          So oder so, Beispieldaten als SQL oder Array (in PHP-Source Notation) sind immer hilfreich.


          Kommentar


          • #6
            So z.B. in Postgres:
            PHP-Code:
            postgres=# select version() as postgresql_version;
                                 
            postgresql_version
            ------------------------------------------------------------
             
            PostgreSQL 12.2compiled by Visual C++ build 191464-bit
            (1 Zeile)


            postgres=#
            postgres=# create table pickorders (poauftr int, podate timestamp, poart varchar(20));
            CREATE TABLE
            postgres
            =#
            postgres=# insert into  pickorders
            postgres-#                  values (1232, to_timestamp('20200304 1433','YYYYMMDD HH24MI'), 'ABHOLEN'),
            postgres-#                         (1233, to_timestamp('20200304 1733','YYYYMMDD HH24MI'), 'ABHOLEN'),
            postgres-#                         (1234, to_timestamp('20200304 1322','YYYYMMDD HH24MI'), 'ABHOLEN'),
            postgres-#                         (1234, to_timestamp('20200304 1510','YYYYMMDD HH24MI'), 'ÜBERGEBEN');
            INSERT 0 4
            postgres
            =#
            postgres=# select * from pickorders;
             
            poauftr |       podate        |   poart
            ---------+---------------------+-----------
                
            1232 2020-03-04 14:33:00 ABHOLEN
                1233 
            2020-03-04 17:33:00 ABHOLEN
                1234 
            2020-03-04 13:22:00 ABHOLEN
                1234 
            2020-03-04 15:10:00 ÜBERGEBEN
            (4 Zeilen)


            postgres=# select poauftr,json_agg( json_build_object(poart,to_char(podate,'HH24:MI')))
            postgres-#   from pickorders
            postgres-#  group by poauftr
            postgres-#  order by 1;
             
            poauftr |                     json_agg
            ---------+--------------------------------------------------
                
            1232 | [{"ABHOLEN" "14:33"}]
                
            1233 | [{"ABHOLEN" "17:33"}]
                
            1234 | [{"ABHOLEN" "13:22"}, {"ÜBERGEBEN" "15:10"}]
            (
            3 Zeilen)


            postgres=#
            postgres=# drop table pickorders;
            DROP TABLE
            postgres
            =

            Kommentar


            • #7
              Zitat von ds160384 Beitrag anzeigen
              Jetzt möchte ich aber, dass für jeden Auftrag ein DIV angezeigt wird.

              Auftrag 1232
              ABHOLEN: 14:33


              Auftrag 1233
              ÜBERGEBEN: 17:33


              Auftrag 1234
              ABHOLEN: 13:22
              ÜBERGEBEN: 15:10
              Das sieht ja eher nach Gruppenwechsel aus.

              Kommentar


              • #8
                protestix Wenn du die Daten nach Aufträgen sortierst kann das Problem auch per Gruppenwechsel realisiert werden. Wie die Ausgabe erfolgt (Mehrzeilig, Einzeilig) sehe ich erstmal als zweitrangig an.
                Was genau gebraucht wird wissen wir nicht, da der TE sich leider nicht mehr gemeldet hat.

                Da das Pivot-Problem öfter mal vorkommt möchte ich nach den schönen Beispiel von Perry Staltic für Postgres noch 2 hinterher werfen.

                1. SQlite mit PDO
                SQLite hat den Vorteil das es überall läuft wo auch PHP verfügbar ist und auch in zahlreichen Onlinetools wie die Sandbox. Zudem wird es häufig von der Leistung unterschätzt.

                PHP-Code:
                <?php
                $dsn  
                "sqlite::memory:";
                $db = new PDO($dsnnullnull, [
                  
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                  
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
                ]);

                $sql "CREATE TABLE table1(
                  porder int, 
                  date datetime, 
                  type text);"
                ;
                $db->exec($sql);

                $sql "INSERT INTO table1 (porder, date, type) VALUES
                (1232, '2020-03-04 14:33:00', 'ABHOLEN'),
                (1233, '2020-03-04 17:33:00', 'ABHOLEN'),
                (1234, '2020-03-04 13:22:00', 'ABHOLEN'),
                (1234, '2020-03-04 15:10:00', 'ÜBERGEBEN')
                ;"
                ;
                $db->exec($sql);

                $sql "SELECT porder,
                  max(case when type = 'ABHOLEN' then date end) as dateA,
                  max(case when type = 'ÜBERGEBEN' then date end) as dateU
                FROM table1
                GROUP BY porder"
                ;

                $result $db->query($sql)->fetchAll();
                echo 
                "<pre>".var_export($result,true)."</pre>";
                Ausgabe:

                Code:
                array (
                  0 => 
                  array (
                    'porder' => '1232',
                    'dateA' => '2020-03-04 14:33:00',
                    'dateU' => NULL,
                  ),
                  1 => 
                  array (
                    'porder' => '1233',
                    'dateA' => '2020-03-04 17:33:00',
                    'dateU' => NULL,
                  ),
                  2 => 
                  array (
                    'porder' => '1234',
                    'dateA' => '2020-03-04 13:22:00',
                    'dateU' => '2020-03-04 15:10:00',
                  ),
                )

                2. Pure PHP mit einer Array-Klasse

                PHP-Code:
                //https://github.com/jspit-de/tableArray
                require __DIR__."/../class/tableArray.php";  //Pfad anpassen

                $data = [
                  [
                'porder' => '1232','date' => '2020-03-04 14:33:00','type' => 'ABHOLEN'],
                  [
                'porder' => '1233','date' => '2020-03-04 17:33:00','type' => 'ABHOLEN'],
                  [
                'porder' => '1234','date' => '2020-03-04 13:22:00','type' => 'ABHOLEN'],
                  [
                'porder' => '1234','date' => '2020-03-04 15:10:00','type' => 'ÜBERGEBEN']
                ];

                $result tableArray::create($data
                  ->
                pivot('porder','date','type')
                  ->
                fetchAll();

                echo 
                "<pre>".var_export($result,true)."</pre>"
                Ausgabe

                Code:
                array (
                  1232 => 
                  array (
                    'porder' => '1232',
                    'date.ABHOLEN' => '2020-03-04 14:33:00',
                    'date.ÜBERGEBEN' => NULL,
                  ),
                  1233 => 
                  array (
                    'porder' => '1233',
                    'date.ABHOLEN' => '2020-03-04 17:33:00',
                    'date.ÜBERGEBEN' => NULL,
                  ),
                  1234 => 
                  array (
                    'porder' => '1234',
                    'date.ABHOLEN' => '2020-03-04 13:22:00',
                    'date.ÜBERGEBEN' => '2020-03-04 15:10:00',
                  ),
                )

                Kommentar

                Lädt...
                X