Ankündigung

Einklappen
Keine Ankündigung bisher.

MAX() in einer foreach Schleife

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    PHP-Code:
    <?php

                    $sql 
    "***";

                    
    $result $pdo->query($sql); ?>

                    <div class="table">
                        <table>
                            <tr class="border">
                                <th>Auktion</th>
                                <th>Höchstgebot</th>
                                <th>User</th>
                            </tr>

                            <?php foreach ($result as $reihe):
    /*Nacheinander alle beendeten Auktionen mit
    Angabe des Höchstbietenden (kunde) und den dazu gehörenden (MAX(preiseingabe))*/

                            
    ?><tr>
                            <td><?php echo $reihe['titel'];?></td>
                            <td><?php echo $reihe['max']; ?></td>
                            <td><?php echo $reihe['kunde']; ?></td>
                            </tr>
                            <tr style="height:0.4em"></tr>
                            <?php endforeach; ?>
                        </table>
                    </div>

    Kommentar


    • #17
      Zitat von king-ich Beitrag anzeigen
      Habe wichtige Daten einer.sql Datei als .txt Datei im Anhang.

      Hoffe das reicht zum auswerten..

      Danke schon einmal für's Interesse und eingebrachter Zeit. [ATTACH]n1563611[/ATTACH]
      Du hast also 5 verschiedene Auktionen mit jeweils einer anderen Aktionsnummer. Du gruppierst (u.a.) nach diesen 5 Nummern, also willst Du diese 5 auch alle sehen. Für jede bekommst dann das max(), was nach mehr oder weniger langer Nachdenkzeit offensichtlicher Murks ist. Oder?
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #18
        Code:
        --
        -- Daten für Tabelle `gebote`
        --
        
        INSERT INTO `gebote` (`id`, `kunde`, `angebot_id`, `preiseingabe`, `timestamp`) VALUES
        (25, 'Maxi', '30', '1.00', '1571946761'),
        (26, 'King Ich', '30', '1.00', '1571946924'),
        (27, '123', '30', '1.00', '1572275442'),
        (28, 'Maxi', '35', '181.00', '1573243707'),
        (29, 'King Ich', '35', '182.00', '1573244905');
        Er hat vermutlich da mehr Gebote zu jeder Auktion und will in der Liste das jeweils höchste anzeigen?

        king-ich Ja?
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #19
          Für jede bekommst dann das max(), was nach mehr oder weniger langer Nachdenkzeit offensichtlicher Murks ist. Oder?
          Aber das ist genau das was ich will:

          Alle beendeten Auktionen mit Angabe des (MAX(preiseingabe) und welcher (kunde) das MAX() abgegeben hat.

          Kommentar


          • #20
            hausl Ja

            Kommentar


            • #21
              timestamp .. *graus* *schauder* ... DATETIME für lesbare Datum+Zeitangaben !
              "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

              Kommentar


              • #22
                Zitat von eagle275 Beitrag anzeigen
                timestamp .. *graus* *schauder* ... DATETIME für lesbare Datum+Zeitangaben !
                Es sollen keine lesbaren Datums+Zeitangaben daraus resultieren. Es ist für den Fall dass 2 Gebote in selber Höhe abgegeben werden, und per timestamp ermittelt wird wer zuerst den Preis abgegeben hat.

                Kommentar


                • #23
                  das ist mir schon klar - aber spätestens bei der Anzeige der Gewinner würde ich doch eigentlich etwas erwarten in der Form

                  Code:
                  Bieter <Horst> hat bei der Auktion <12345678> mit einem Gebot von <20€> gewonnen.
                  Das Gewinner Angebot / Auktionsende war "13:00 Uhr am 11.11.2019"
                  "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

                  Kommentar


                  • #24
                    Zitat von eagle275 Beitrag anzeigen
                    das ist mir schon klar - aber spätestens bei der Anzeige der Gewinner würde ich doch eigentlich etwas erwarten in der Form

                    Code:
                    Bieter <Horst> hat bei der Auktion <12345678> mit einem Gebot von <20€> gewonnen.
                    Das Gewinner Angebot / Auktionsende war "13:00 Uhr am 11.11.2019"
                    So in etwa ist es ja.

                    Der Problemcode ist nur ein Teil einer .php Datei, die sich Übersicht nennt, und auf der an einer anderen Stelle das Ende der Auktion sichtbar wird.

                    Kommentar


                    • #25
                      Die Faustregel die akretschmer genannt hat, muss eingehalten werden (soweit Faustregeln eben einzuhalten sind-also nicht immer, aber mit vernachlässigbaren Ausnahmen). Das garantiert zunächst unter mysql ein reproduzierbares(!) Ergebnis, unter anderen DB ist es "überflüssig", man würde bei Regelverletzung einen Fehler erhalten, ansonsten sowieso ein reproduzierbares Ergebnis.
                      Das Einhalten der Regel garantiert darüber hinaus kein brauchbares Ergebnis oder: Die richtige Nutzng von Group By führt nicht dazu, dass mysql richtig rät, was Du wissen wolltest, nur dass es ein funktionierendes Statement wird, ohne Fehler, mit stabilem Ergebnis.

                      Dein Statement oben sagt, gib mir alle Werte von "gebote.kunde", alle auktionsnummern, alle titel und den dabei maximalen Preis. Genau das erhälst Du. Ein Group by ist kein Filter!
                      Du schreibst, dass Du "alle" Angebote erhälst, ein Ergebnis, das Du schon hattest und Dir nicht gefällt. Dazu muss man sagen, dass Dein selbstgebautes Daten-Beispiel einfach zu sparsam ist. Füge mehr Gebote ein (auf die bereits bebotenen Angebote) und Du wirst sehen, dass Du nicht alle Gebote erhälst. Vielleicht verstehst Du dann auch langsam, was ein "group by" bewirkt. Dazu noch: Ein group by ist kein eigenständiger Selectbestandteil, es ist ein Hilfskonstrukt, das in Deinem Beispiel zur Max() Funktion "gehört" und angibt, wie die nicht "maximierten" Felder behandelt werden sollen.
                      Vielleicht als Trost, wenn Du es nicht begreifst: mysql Entwickler dachten, sie hätten es kapiert und haben diese bescheuerte "Vereinfachung" (weil fehlerhaft) erfunden, die seit dem Generationen von Entwicklern auf die Füße fällt.

                      Und noch was im Bereich "Hellsehen":
                      Du filterst nach einem user. Das ist der Angebotsuser und nicht der Kundeuser. Der Angebotsuser ist king ich und gilt für alle Ergebnisse. Der Kundeuser, den Du auch ausgibst, wechselt dabei. Willst Du vielleicht eigentlich den Kundeuser filtern?

                      Kommentar


                      • #26
                        Der Angebotsuser ist king ich und gilt für alle Ergebnisse.
                        So soll es sein..
                        Der Kundeuser, den Du auch ausgibst, wechselt dabei.
                        Ist richtig. Der kunde ist ja nicht immer der Selbe.

                        Kommentar


                        • #27
                          So und nun? Was ist mit dem Mittelteil?

                          Hier ein Beispiel:
                          Code:
                          MariaDB [test]> select version() as 'mysql version';
                          +-----------------+
                          | mysql version   |
                          +-----------------+
                          | 10.1.26-MariaDB |
                          +-----------------+
                          1 row in set (0.00 sec)
                          
                          MariaDB [test]>
                          MariaDB [test]> create table testmax (tstm_name varchar(20), tstm_wert int);
                          Query OK, 0 rows affected (0.02 sec)
                          
                          MariaDB [test]> insert into testmax values('a', 3), ('b', 5);
                          Query OK, 2 rows affected (0.00 sec)
                          Records: 2  Duplicates: 0  Warnings: 0
                          
                          MariaDB [test]> select * from testmax;
                          +-----------+-----------+
                          | tstm_name | tstm_wert |
                          +-----------+-----------+
                          | a         |         3 |
                          | b         |         5 |
                          +-----------+-----------+
                          2 rows in set (0.00 sec)
                          
                          MariaDB [test]>
                          MariaDB [test]> select tstm_name, max(tstm_wert)
                              ->   from testmax
                              ->  group by tstm_name;
                          Welches Ergbnis erwartest Du?
                          Code:
                          MariaDB [test]>
                          MariaDB [test]> select tstm_name, max(tstm_wert)
                              ->   from testmax
                              ->  group by tstm_name;
                          +-----------+----------------+
                          | tstm_name | max(tstm_wert) |
                          +-----------+----------------+
                          | a         |              3 |
                          | b         |              5 |
                          +-----------+----------------+
                          2 rows in set (0.00 sec)
                          
                          MariaDB [test]>
                          Das Select Statement mit Group By und Max() gibt "alle" Daten aus, die da sind. Das ist vollkommen in Übereinstimmung mit seiner Funktion.
                          Das Maximum von tstm_wert, gruppiert nach dem Feld tstm_name.

                          Weiter:
                          Code:
                          MariaDB [test]>
                          MariaDB [test]> insert into testmax values('a', 4);
                          Query OK, 1 row affected (0.01 sec)
                          
                          MariaDB [test]>
                          MariaDB [test]> select tstm_name, max(tstm_wert)
                              ->   from testmax
                              ->  group by tstm_name;
                          Was ist nun das Ergebnis?
                          Code:
                          MariaDB [test]>
                          MariaDB [test]> select tstm_name, max(tstm_wert)
                              ->   from testmax
                              ->  group by tstm_name;
                          +-----------+----------------+
                          | tstm_name | max(tstm_wert) |
                          +-----------+----------------+
                          | a         |              4 |
                          | b         |              5 |
                          +-----------+----------------+
                          2 rows in set (0.00 sec)
                          
                          MariaDB [test]>
                          MariaDB [test]> drop table testmax;
                          Query OK, 0 rows affected (0.03 sec)
                          Ich habe oben geschrieben, "group by" sei kein eigenständiger SQL Bestandteil, streng genommen stimmt das nicht, aber in Deinem Statement. Nimm mal mein Beispiel erzeuge die Tabelle und die Daten und lass das Statement laufen ohne max(tstm_wert). Was erwartest Du als Ergebnis?

                          Code:
                          select tstm_name
                            from testmax
                           group by tstm_name
                          Was ist der Unterschied zu
                          Code:
                          select tstm_name
                            from testmax
                          ?

                          Überleg Dir die Implikationen für Dein Statement, oder besser: für Dein gewünschtes Ergebnis. Was soll das Ergebnis sein und wie kommst Du da hin?
                          (Und tu Dir selbst den Gefallen, sei nie mehr zu faul, ein Group By Statement in mysql zu schreiben, dass die Faustregel nicht berücksichtigt. Das ist geschenkte Lebenszeit. Wenn Dir irgendwann klar ist, warum die Faustregel nicht immer gilt, kannst Du es machen wie Du es brauchst)

                          Kommentar


                          • #28
                            Ich habe mittlerweile 2 Freelancer angeschrieben, die mir auch nicht helfen können.
                            Ich möchte hiermit eine Auftrag ausschreiben, da ich nicht weiter komme, mir die Query zu schreiben.
                            Bitte mit Kostenvoranschlag

                            Kommentar


                            • #29
                              Ich habe den Eindruck, daß Du schon mal selber gar nicht weißt, was Du willst. Dir ist hier so intensiv erklärt worden, was wie funktioniert, und Du stellt Dich an wie 3 Meter Feldweg. Das ist auch mit Geld nicht zu heilen.
                              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                              Kommentar


                              • #30
                                Zitat von akretschmer Beitrag anzeigen
                                Ich habe den Eindruck, daß Du schon mal selber gar nicht weißt, was Du willst. Dir ist hier so intensiv erklärt worden, was wie funktioniert, und Du stellt Dich an wie 3 Meter Feldweg. Das ist auch mit Geld nicht zu heilen.
                                Das was ich will:

                                Alle beendeten Auktionen mit Angabe des (MAX(preiseingabe) und welcher (kunde) das MAX() abgegeben hat.:
                                Code:
                                "Select alle beendeten 'angebote' mit jeweiliger Angabe des Kunden der am höchsten Geboten hat
                                ​​​​​​​und dessen MAX(preiseingabe) WHERE 'angebote.user' = eingeloggter Nutzer"

                                Kommentar

                                Lädt...
                                X