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

  • MAX() in einer foreach Schleife

    Hallo.
    Ich hab nach langer Zeit mal wieder eine Frage, mit der Bitte mir zu helfen..:

    Folgender Code soll mir in einer foreach Schleife Alle beendeten Auktionen mit dem jeweiligem Höchstgebot anzeigen.

    Ich hab den Code gefühlt 10000 mal umgeschrieben, mich mit google gestritten, und komme allein nicht weiter..
    Code:
    $sql = "SELECT gebote.kunde, MAX(preiseingabe) AS max, angebote.Auktionsnummer, angebote.titel
    FROM gebote LEFT JOIN angebote ON gebote.angebot_id = angebote.Auktionsnummer
    WHERE timediff(now(), angebote.dauer) > 0 AND angebote.user = '{$user}'";
    Ein Ergebnis war, dass Alle Gebote angezeigt wurden, ein anderes, dass ein einzelner Kunde (scheinbar willkürlich) mit dem höhsten Gebot in der Datenbank angezeigt wurde.

    Ich brauche Hilfe.

  • #2
    Du möchtest Dich bitte mit der genauen Syntax bei Aggregationen beschäftigen. Da MySQL selbst zu blöd ist, den Fehler zu erkennen: alle Spalten im Result müssen entweder aggregiert oder gruppiert werden. Macht man das nicht, liefert MySQL ein zufälliges Result. Technik, die begeistert!
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Wenn ich gruppiere:
      PHP-Code:
      $sql "SELECT gebote.kunde, MAX(preiseingabe) AS max, angebote.Auktionsnummer, angebote.titel
      FROM gebote LEFT JOIN angebote ON gebote.angebot_id = angebote.Auktionsnummer
      WHERE timediff(now(), angebote.dauer) > 0 AND angebote.user = '
      {$user}' GROUP BY kunde, preiseingabe, Auktionsnummer, titel"
      erhalte ich ein bereits benanntes Ergebnis; Alle Gebote werden angezeigt.
      und agregiert habe ich mit
      Code:
       MAX(preiseingabe) AS max

      Kommentar


      • #4
        Herr, wirf Hirn.

        Entweder aggregiert, oder gruppiert. Du hast 4 Felder im Result, davon eines aggregiert. Frage (laß Dir Zeit mit der Antwort, ist kompliziert): nach wie vielen Feldern muß Du gruppieren?


        Wenn Du das richtig hast, sehen wir weiter ...
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Herr, wirf Hirn.
          Ich weiß es nicht

          Kommentar


          • #6
            Okay, als Hilfestellung: gegeben: 4 Felder im Select, davon eines eine Aggregation. Man könnte quasi sagen: 4-1. Kannst Du folgen?
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Ja, ich kann Dir folgen.

              Kommentar


              • #8
                Zitat von king-ich Beitrag anzeigen
                Ich weiß es nicht
                Akretschmer meint, jedes Feld, dass du im Select-Teil stehen hast muss entweder im Group By stehen ODER aggregiert (per z.B. Max) werden.
                Du hast preiseingabe sowohl im group by als auch als Aggregat, durch das group by hast du aber eh schon nur einmal "preiseingabe" pro Zeile und max() bringt nichts.

                Kurz: Nimm preiseingabe aus dem group by raus.
                Lang: Versuch mal die einzelnen Schritte aufzuzeichnen wie sich das Ergebnis durch die Gruppierungen und anschließend das max() verändert.
                [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                Kommentar


                • #9
                  Kurz: Nimm preiseingabe aus dem group by raus
                  :
                  PHP-Code:
                  $sql "SELECT gebote.kunde, MAX(preiseingabe) AS max, angebote.Auktionsnummer, angebote.titel
                  FROM gebote LEFT JOIN angebote ON gebote.angebot_id = angebote.Auktionsnummer
                  WHERE timediff(now(), angebote.dauer) > 0 AND angebote.user = '
                  {$user}' GROUP BY kunde, Auktionsnummer, titel"
                  Ergebnis: Alle Gebote werden angezeigt..
                  Soweit war ich ja bereits schon, bevor ich mich hilfesuchend an Euch gewendet habe.

                  Kommentar


                  • #10
                    auf was soll sich denn das max() beziehen? Wenn Du nach Auktionsnummer gruppierst, und jede hat da seine eigene, dann ist das Result nachvollziehbar ...
                    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                    Kommentar


                    • #11
                      Zitat von akretschmer Beitrag anzeigen
                      auf was soll sich denn das max() beziehen? Wenn Du nach Auktionsnummer gruppierst, und jede hat da seine eigene, dann ist das Result nachvollziehbar ...
                      Das max() soll sich auf die größte 'preiseingabe' einer 'Auktionsnummer' beziehen, die einen eigenen 'titel' und einen höchstbietenden 'kunde` hat.

                      Ist wohl vom Ansatz her schon eine falsche Query?(!)

                      Kommentar


                      • #12
                        Dann zeig mal ein paar Beispieldaten und das gewünschte Ergebnis für diese Daten.
                        [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                        [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                        Kommentar


                        • #13
                          PHP-Code:
                          <?php

                                          $sql 
                          "SELECT gebote.kunde, MAX(preiseingabe) AS max, angebote.Auktionsnummer, angebote.titel
                          FROM gebote LEFT JOIN angebote ON gebote.angebot_id = angebote.Auktionsnummer
                          WHERE timediff(now(), angebote.dauer) > 0 AND angebote.user = '
                          {$user}'
                          GROUP BY gebote.kunde, angebote.Auktionsnummer, angebote.titel"
                          ;

                                          
                          $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):
                                                  
                          $titel $reihe['titel'];
                                                  
                          $preis $reihe['max'];
                                                  
                          $kunde $reihe['kunde'];
                                                  
                          $preiseingabe number_format($preis2","".");

                                                  
                          ?><tr>
                                                  <td><?php echo $titel;?></td>
                                                  <td><?php echo $preiseingabe?></td>
                                                  <td><?php echo $kunde?></td>
                                                  </tr>
                                                  <tr style="height:0.4em"></tr>
                                                  <?php endforeach; ?>
                                              </table>
                                          </div>
                          Reicht?

                          Kommentar


                          • #14
                            Ne, das sind ja nicht die Daten. Wir müssen ja irgendwie nachvollziehen wie es in deiner Datenbank aussieht und wie das Ergebnis davon aussehen soll.
                            [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                            [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                            Kommentar


                            • #15
                              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. auktion.txt

                              Kommentar

                              Lädt...
                              X