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

  • #31
    Dann willst Du im Select 2 Spalten: Kunde und max(preiseingabe). Der Rest wurde mehrfach erklärt.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #32
      Ich würde das mit einem Sub-Select lösen:

      Code:
      SELECT g.kunde, s.max_preis
      FROM gebote g
      JOIN
      (
      SELECT angebot_id, MAX(preiseingabe) AS max_preis, MAX(timestamp) as max_timestamp
      FROM gebote LEFT JOIN angebote ON gebote.angebot_id = angebote.Auktionsnummer
      WHERE timediff(now(), angebote.dauer) > 0 -- AND angebote.user = '{$user}
      GROUP BY angebot_id) as s on s.angebot_id = g.angebot_id AND s.max_preis = g.preiseingabe AND s.max_timestamp = g.timestamp
      sorry, shift-taste kaputt

      Kommentar


      • #33
        Zitat von akretschmer Beitrag anzeigen
        Der Rest wurde mehrfach erklärt.
        Wurde es m.E. nicht. Der springende Punkt ist doch, was hausl schrieb, dass er mehrere Gebote zu jeder Auktion hat, er aber immer nur den Kunden mit dem jeweils höchsten Gebot und Timestamp des jeweiligen Angebots haben will.
        Ich lasse mir aber gerne anhand des Dumps in #15 zeigen, wie man das ohne Sub-Select lösen kann.
        sorry, shift-taste kaputt

        Kommentar


        • #34
          Zitat von Meister1900 Beitrag anzeigen

          Wurde es m.E. nicht. Der springende Punkt ist doch, was hausl schrieb, dass er mehrere Gebote zu jeder Auktion hat, er aber immer nur den Kunden mit dem jeweils höchsten Gebot und Timestamp des jeweiligen Angebots haben will.
          Ich lasse mir aber gerne anhand des Dumps in #15 zeigen, wie man das ohne Sub-Select lösen kann.
          Letzteres wird nicht geschehen. Es geht nicht ohne sub-select, und das kann man auch begründen:
          1. Die Gruppenbildung erfolgt immer so, daß die Werte aller einbezogenen Spalten die Gruppe konstituieren. Deshalb bildete die Abfrage des TE in #9 für jedes Gebot jedes Bieters pro Angebot (=Ware) eine Gruppe. Das Abfrageergebnis enthielt so zwar die gewünschten Zeilen, aber eben nicht nur die.
          2. Das der Kunde in die Gruppenbildung aufgenommen wurde, war dadurch motiviert, daß man ja schließlich den Bieter erhalten will, der das höchste Gebot abgegeben hat und nicht nur das jeweils höchste Gebot pro Angebot. Letzeres würde man erhalten, wenn man 'kunde' sowohl in der Feldauswahl als auch in der GROUP BY-Klausel wegläßt.
          3. Läßt man 'kunde' nur beim GROUP BY weg, funktioniert die Abfrage zwar in MySQL (und das ist auch richtig so! Es ist an uns als Entwickler, zu erkennen, ob die Nutzung dieser Möglichkeit Sinn macht), ist aber einfach unsinnig, weil von den bis zu 3 verschiedenen Bietern ja nur einer genannt werden kann.
          4. Also muß die Tabelle 'gebote' mit der unter 2. genannten Abfrage (ohne 'kunde') verjoint werden, über die Spalten preis = maxpreis und angebot_id.
          Deshalb führt kein Weg an der verschachtelten Abfrage vorbei.

          P.S. Und daran ändern auch Bemerkungen wie "Herr, wirf Hirn", "...3 Meter Feldweg" und Unterstellungen, der TE wisse nicht was er wolle, nichts. Er hat es sich nicht gerade sehr gut verständlich gemacht, ja, aber mit ein wenig gutem Willen konnte man sich dann ja schon denken, daß er nicht nur das höchste Gebot pro Ware wissen wollte, sondern auch, wer's abgegeben hat.

          Kommentar


          • #35
            Danke * Jetzt läuft das Script

            Das Lustige, (oder vielmehr Traurige): Seit über 10 Jahren bettel ich nach einem Bildungsgutschein für den Bereich Webentwicklung, ohne Erfolg.
            Jetzt werde ich Anfang 2020 in 'nem Betrieb Hospitieren.
            Vielleicht bin ich dann endlich nicht mehr Hilfesuchend, sondern kann evtl. selbst Hilfestellung geben.
            Vielen vielen Dank

            Christian

            Kommentar


            • #36
              Zitat von king-ich Beitrag anzeigen
              Danke * Jetzt läuft das Script

              Das Lustige, (oder vielmehr Traurige): Seit über 10 Jahren bettel ich nach einem Bildungsgutschein für den Bereich Webentwicklung, ohne Erfolg.
              Jetzt werde ich Anfang 2020 in 'nem Betrieb Hospitieren.
              Vielleicht bin ich dann endlich nicht mehr Hilfesuchend, sondern kann evtl. selbst Hilfestellung geben.
              Vielen vielen Dank

              Christian
              Die Hauptsache ist nicht, daß dein Script jetzt läuft, sondern daß bzw. was du daraus gelernt hast:
              1. Du solltest dich vielleicht nicht so überschwenglich bedanken, wir helfen hier "ehrenamtlich" mit "Hilfe zur Selbsthilfe" und jeder weiß, warum er/sie das tut. Eine neue "Währung" in Form von "emotionalen Einheiten" brauchst du also, nachdem gottseidank niemand auf dein "finanzielles Angebot" eingegangen ist, also nicht konstruieren...
              2. Bildungsgutschein hin oder her: Ich hoffe nicht, daß das ein Hinweis auf (d)eine mißliche wirtschaftliche Lage ist, schlimmstenfalls kriegst du Sozialgeld und "darfst" unter Verrechnung mit der Stütze "nebenberuflich freiberuflich" arbeiten. Einen solchen Zustand, der hoffentlich nicht gegeben ist, solltest du schnellstmöglich beenden! Wichtig: So weit wie Du jetzt schon bei allen Mängeln bist, solltest du nicht auf "Bildungsangebote" sondern eher auf "Learning by doing" setzen. Das Forum hilft da gerne.
              3. Hauptsache, du hast verstanden, warum das nur so funktionieren kann, wie Meister1900 es dir gezeigt hat, in meinem obigen Beitrag #34 habe ich es begründet. Wenn was noch unklar ist, bitte (warum eigentlich "bitte", es ist ja in deinem Interesse... ) nachfragen.
              4. Es gibt noch eine ganze Reihe anderer Schwächen, die du ausmerzen solltest: falscher Datentyp bei gebote.angebot_id, EVA-Prinzip (evtl. i.O. aber nochmal überprüfen), Datums-Datentyp usw.
                Sprich es einfach hier nochmal an, man hilft dir da sicherlich gerne.
              5. Tipp: Du solltest dich hier vielleicht nicht so vorführen lassen wie z.B. in den Beiträgen #5 - #7...

              Kommentar


              • #37
                Zitat von king-ich Beitrag anzeigen
                Danke .. Jetzt läuft das Script ..
                Vielleicht bin ich dann endlich nicht mehr Hilfesuchend, sondern kann evtl. selbst Hilfestellung geben.
                Nicht gleich übermütig werden

                Noch ein Feedback meinerseits.
                1. Man gibt gerne die funktionierende Lösung bekannt, wenn man sie endlich (bekommen oder rausgefunden) hat. Denn personal coaching ist nicht die Funktionsweise und der Sinn eines Forums.
                2. Ich sehe es nicht so, dass man nicht schreiben darf, wenn man etwas nicht versteht. Keine Frage der Ehre. Man sollte schreiben, was man konkret durchführt und welche Fehler man erhält und was genau nicht verstanden wird. Ich fürchte, die vorgegebene Lösung hat Dich nicht weitergebracht.
                3. Deine Ausdauer ist lobenswert, Du würdest Dir einen Gefallen tun, wenn Du nicht auf "Fütterung" spekulierst, sondern präziser mit den Informationen arbeitest.
                Konkret: Auf die Nachfrage zu Deiner Wunschvorstellung ist es nicht zielführend, ein (pseudo) SQL Statement zu posten, nachdem klar ist, dass Du dieses SQL nicht verstehst.
                Man gibt statt dessen Ausgangsdaten an und die gewünschte Zieldarstellung, ein wenig Erläuterung schadet (meist) nicht, kann aber schon missverständlich sein.

                Viel Erfolg mit Deiner Hospitation

                Kommentar


                • #38
                  Zitat von Perry Staltic Beitrag anzeigen
                  Nicht gleich übermütig werden

                  ... Ich fürchte, die vorgegebene Lösung hat Dich nicht weitergebracht.
                  ...
                  Viel Erfolg mit Deiner Hospitation
                  Sorry, hab' ich da was verpasst? Woher willst du das wissen, daß die Lösung ihn nicht weitergebracht hat. Wenn er die Abfrage von Meister1900 an entsprechender Stelle einfügt (den Code hätten wir dann allerdings gerne gesehen, da gebe ich dir Recht), bringt sie ihm genau, was er will. Warum sollte das nicht funktionieren?

                  Kommentar


                  • #39
                    Ich meinte, dass er nicht wirklich etwas gelernt hat.

                    Kommentar


                    • #40
                      Zitat von Perry Staltic Beitrag anzeigen
                      Ich meinte, dass er nicht wirklich etwas gelernt hat.
                      Das ist wohl leider eine sehr berechtigte Befürchtung. Ich schrieb oben: "Die Hauptsache ist nicht, daß dein Script jetzt läuft, sondern daß bzw. was du daraus gelernt hast:" Zu befürchten steht, daß seine Prioritäten ganz andere sind.

                      Aber ehrlich: Ist das hier nicht fast immer so? Ich kann's auch nicht ganz nachvollziehen, aber irgendwie meinen die Leute, durch 25mal abgucken könne man was lernen.

                      Kommentar


                      • #41
                        Zitat von marie123 Beitrag anzeigen
                        "Die Hauptsache ist nicht, daß dein Script jetzt läuft, sondern daß bzw. was du daraus gelernt hast:"
                        ...
                        Aber ehrlich: Ist das hier nicht fast immer so?
                        Leider ja, Stackoverflow-Prinzip. Egal wie scheisse dein Code ist und wie viele Fehler und Lücken du darin hast.. wenn du keine "Antwort auf die Frage" gibst wirst du gerügt. Ist mir selbst schon passiert, dann habe ich es dort gelassen. So viel zu deren Eingangs-Slogan "... for developers to learn". Na eh bei gnadenlosen Q&A lernt man sicher viel.. /Irnoie-Off .

                        Ist dann genau das Thema hier oben, welchen Anspruch hat ein Forum / eine Community. Und hier ist es eigentlich schon so, dass Lernen vor "Hauptsache es läuft" steht, daher wirkt es oft auch "Oberlehrerhaft". Ist halt einfach oft auch nötig. Und hängt natürlich auch vom Fragesteller, dessen Interessen und Motiv ab, keine Frage. Manche finden es geil dieses und jenes jetzt zu kennen oder zu benennen können (= gelernt zu haben), andere ist es sch.. egal, solange der Kot(sic!) läuft.
                        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


                        • #42
                          Sorry, für Off-Topic, aber ich werde bei StackOverflow zu 99% immer fündig, egal was für ein Problem. Die Herausforderung ist nur, das Problem möglichst gut auf englisch formulieren zu können und die vermeintliche Lösung auf das eigene Problem adaptieren zu können.
                          Und ich persönlich lerne am Besten, in dem ich Code oder Lösungen von anderen sehe und versuche diese zu verstehen und indem ich in die offziellen Dokus / Manuals schaue. Letzteres wird m.E. viel zu wenig gemacht von den Fragestellern hier im Forum.
                          Wenn mir jemand wie "Marie" einen seitenweisen Roman auf Deutsch schreibt, der dann auch noch in elenden Diskussionen ausartet, wo man hinterher als Anfänger gar nicht mehr weiss, wo man dran ist, weiß ich nicht, ob das hilfreich ist.
                          Erst Recht in einer Welt, wo alle nur noch im Stress sind, "so schnell wie möglich" eine Lösung finden zu "müssen" oder bei denen, wo die Welt nur noch aus 280 Zeichen besteht und Youtube-Videos spätestens nach 2 Minuten weggeklickt werden, weil die persönliche Aufmerksamkeitsspanne unter der eines Goldfisches liegt.
                          sorry, shift-taste kaputt

                          Kommentar


                          • #43
                            Zitat von hausl Beitrag anzeigen

                            Leider ja, Stackoverflow-Prinzip. Egal wie scheisse dein Code ist und wie viele Fehler und Lücken du darin hast.. wenn du keine "Antwort auf die Frage" gibst wirst du gerügt. Ist mir selbst schon passiert, dann habe ich es dort gelassen. So viel zu deren Eingangs-Slogan "... for developers to learn". Na eh bei gnadenlosen Q&A lernt man sicher viel.. /Irnoie-Off .

                            Ist dann genau das Thema hier oben, welchen Anspruch hat ein Forum / eine Community. Und hier ist es eigentlich schon so, dass Lernen vor "Hauptsache es läuft" steht, daher wirkt es oft auch "Oberlehrerhaft". Ist halt einfach oft auch nötig. Und hängt natürlich auch vom Fragesteller, dessen Interessen und Motiv ab, keine Frage. Manche finden es geil dieses und jenes jetzt zu kennen oder zu benennen können (= gelernt zu haben), andere ist es sch.. egal, solange der Kot(sic!) läuft.
                            Um mal vom Schimpfen über die Fragesteller - was du über Stackoverflow schreibst, kann ich ohnehin nicht nachvollziehen, habe mit dem Forum/Portal keine Erfahrungen - wegzukommen (habe ja selbst damit angefangen, Asche auf mein Haupt!):

                            Die Aufgabe war ja auch erstmal nicht einfach, denn es ging um eine zwar bekannte, aber deswegen nicht einfachere Problematik im Zusammenhang mit dem GROUP BY-Clause: Inhaltlich besprochen wurde die Thematik in einem anderen Thread, weil sie von einem anderen User dort hineingetragen wurde.
                            1. Um nicht alles wiederholen zu müssen, bitte ich Interessierte zunächst mal nochmal einen Blick auf die Beiträge #32 und #34 zu werfen. Problem ist:
                              Der TE möchte Maximalwerte und benutzt dazu korrekterweise die seit langem existierende Aggregation mit dem GROUP BY-Clause und Aggregationsfunktion, hier max(). Nun kann ihm die Aggregation aber zunächst mal nur das Höchstgebot zum jeweiligen Angebot = Ware liefern, nicht aber den Bieter, der dieses Gebot abgegeben hat. Diesen Bieter in der gleichen Abfrage auch zu ermitteln und damit Datensätze nach dem Schema "Angebot - Höchstgebot zu diesem Angebot - Name des Bieters" zu erzeugen, war also die Aufgabe.
                            2. Ob MySQL oder ein anderes DBMS diese Aufgabe - oberflächlich betrachtet - nun löst oder nicht, dabei eine Fehlermeldung ausgibt oder nicht: Die Aufgabenstellung ist, wie in #34 begründet, ohne einen Sub-Select nicht lösbar. Bezieht man dies nochmal ausdrücklich auf die Konstruktion GROUP BY + Aggregatfunktion, muß man es noch schärfer formulieren: sie ist prinzipiell nicht lösbar. Warum? Dazu zitiere ich mich erstmal selbst mit dem Punkt 3. aus #34:
                              Läßt man 'kunde' nur beim GROUP BY weg, funktioniert die Abfrage zwar in MySQL (und das ist auch richtig so! Es ist an uns als Entwickler, zu erkennen, ob die Nutzung dieser Möglichkeit Sinn macht), ist aber einfach unsinnig, weil von den bis zu 3 verschiedenen Bietern ja nur einer genannt werden kann.
                              M.a.W.: für das Angebot Auktionsnummer 35 ("Office PC I5-6400 4x 2.7GHz W...") wurde ein Höchstgebot von 182 von "King Ich" abgegeben. Folgt man nun der "Faustregel", daß in der SELECT-Feldliste keine Spalten auftauchen dürfen, die nicht auch entweder in der Group-by-Liste stehen oder aggregiert werden, gibt es nur 2 Möglichkeiten:
                              a. Nicht-Nennung der Spalte 'kunde' in beiden Listen:
                              Code:
                              SELECT MAX(preiseingabe) AS max, angebote.Auktionsnummer, angebote.titel
                              	FROM gebote LEFT JOIN angebote ON gebote.angebot_id = angebote.Auktionsnummer
                              	GROUP BY angebote.Auktionsnummer, angebote.titel
                              oder
                              b. Nennung von 'kunde' in beiden Listen:
                              Code:
                              SELECT gebote.kunde, MAX(preiseingabe) AS max, angebote.Auktionsnummer, angebote.titel
                              	FROM gebote LEFT JOIN angebote ON gebote.angebot_id = angebote.Auktionsnummer
                              	GROUP BY kunde, angebote.Auktionsnummer, angebote.titel
                              Beides ist gleich unbefriedigend: in a. erfahren wir den Namen des Höchstbietenden nicht (aber genau den wollen wir doch!, vgl. oben 1.), in b. bekommen wir nicht nur den Bieter, sondern auch die Datensätze zu allen Höchstgeboten der einzelnen Bieter, egal ob sie damit die Auktion gewonnen haben oder nicht.
                              Warum ist aber nun die oben aus #34 zitierte Lösung keine wirkliche Lösung?
                              Auch hierzu zunächst mal der SQL-Code:
                              Code:
                              SELECT gebote.kunde, MAX(preiseingabe) AS max, angebote.Auktionsnummer, angebote.titel
                              	FROM gebote LEFT JOIN angebote ON gebote.angebot_id = angebote.Auktionsnummer
                              	GROUP BY angebote.Auktionsnummer, angebote.titel
                              Schauen wir uns das mal näher an: Es wird eine Gruppenbildung über die beiden funktional von einander abhängigen Spalten angebote.Auktionsnummer und angebote.titel durchgeführt, m.a.W. jedes Angebot bildet eine Gruppe. Alle anderen Spalten müssen nun entweder
                              o aggregiert werden oder
                              o von der "führenden" Spalte der Gruppe, hier angebote.Auktionsnummer funktional abhängig sein,
                              weil sonst in der Spalte 'kunde', die nicht aggregiert wird, mehrere Werte auftauchen müssten. Dies ist aber nicht möglich, also zeigt SQL einen zufälligen Wert an, hier "Maxi", obwohl "King Ich" die Auktion gewonnen hat.
                            3. Ob nun ein DBMS den SQL-Standard "verletzt"* oder nicht (Es gibt mind. ein DBMS, nämlich MySQL, das den obigen Code ausführt, ohne einen Fehler zu erzeugen, wenn man dort die Einstellung ONLY_FULL_GROUP_BY deaktiviert.), Tatsache ist: Diese Abfrage ist unsinnig und kann nur ein zufälliges, i.d.R. falsches Ergebnis erbringen.
                            4. Letzteres ist der Grund, warum der Sub-Select unausweichlich ist.
                            Nun noch zu der Frage des Verhaltens von MySQl, obwohl dies mit der Sache nur mittelbar zu tun hat:
                            1. MySQL bietet spätestens seit Versionen höher als 5.7.5 die Möglichkeit, die Einstellung ONLY_FULL_GROUP_BY zu deaktivieren, was die Ausführung fehlerhafter Abfrage wie die oben zuletzt wiedergegebene ermöglicht. Dies ist also kein "Fehler" und auch keine "Standard-Verletzung", sondern lediglich eine Wahlmöglichkeit, die im phpmyadmin vorgesehen ist und nicht etwa, wie Arne Drews im anderen Thread schreibt, darauf zurückzuführen, daß "ThirdParty-Tools diese [Einstellung] sinnfrei überschreiben". Diese Einstellung zu ändern, kann in anderen Konstellationen helfen, wofür es hier im Forum auch bereits Beispiele gab.
                            2. Nochmal zugespitzt: Es handelt sich hier nicht um einen "Fehler", sondern um einen zusätzlichen "Service".
                            3. Alles, was man dazu noch wissen sollte, findet sich hier: https://dev.mysql.com/doc/refman/5.7...-handling.html
                            Zurück zum TE: Er hat sich ja nun offenbar "dankend verabschiedet". Allen, die dies Lesen und auch Probleme mit Group by haben, seien diese Zeilen nochmal dringend ans Herz gelegt - denn es ist so: mit "Standard", "Verboten", "Überwachung der nicht-Verletzung von Standards" usw. usf. kommt man hier nicht ans Ziel. Das einzige, was hilft, ist das Verständnis der Zusammenhänge und Sachverhalte.
                            ____________________________________________
                            * ob es wirklich der Fall ist, daß dies eine Verletzung ist, wissen wir nicht, weil diese Behauptung bisher hier nie belegt wurde

                            Kommentar


                            • #44
                              Zitat von Meister1900 Beitrag anzeigen
                              Sorry, für Off-Topic, ...
                              Wenn mir jemand wie "Marie" einen seitenweisen Roman auf Deutsch schreibt, ...
                              Entschuldige bitte, daß ich die deutsche Sprache beherrsche! Ansonsten auch von mir: sorry für das Off-Topic!

                              Kommentar


                              • #45
                                Zitat von Meister1900 Beitrag anzeigen
                                Ich lasse mir aber gerne anhand des Dumps in #15 zeigen, wie man das ohne Sub-Select lösen kann.
                                Gerne
                                PHP-Code:
                                SELECT g.idg.angebot_idMAX(g.preiseingabe) AS Höchstgebotg.kunde AS `abgegeben von`, FROM_UNIXTIME(min(g.`timestamp`)) AS `Datum Uhrzeit`, a.titel AS `Artikel`
                                FROM gebote g
                                INNER JOIN gebote t ON 
                                (g.angebot_id=t.angebot_id AND g.preiseingabe>t.preiseingabe) OR
                                (
                                g.preiseingabe=t.preiseingabe AND g.timestamp<t.timestamp)
                                LEFT JOIN angebote a ON g.angebot_id a.Auktionsnummer
                                GROUP BY g
                                .angebot_ida.titel 
                                *getestet, jedoch ohne Gewähr auf Richtigkeit der Ausgabe


                                Kommentar

                                Lädt...
                                X