SQL Query mit MAX() und LIMIT

  • Hallo,

    ich versuche gerade etwas hinzubekommen, aber irgendwie klappt es nicht. Anscheinend kann man MAX() und LIMIT nicht zusammen nutzen?!

    Ich hab eine Tabelle, welche wie folgt aufgebaut ist:

    SQL
    id     foo     date
    -------------------------
    1      123     2019-05-03
    2      342     2019-05-02
    3      457     2019-05-01
    4      13      2019-04-30
    5      1       2019-04-29
    6      532     2019-04-28
    7      254     2019-04-27
    8      677     2019-04-26

    Ich brauche die id des Eintrages, bei welchem foo am höchsten ist. Allerdings nur von den letzten 5 Einträgen, sortiert nach dem Datum (DESC).
    In diesem Fall müsste ich die id 3 erhalten.

    SQL
    SELECT id FROM table WHERE foo = (SELECT MIN(foo) FROM table ORDER BY date DESC LIMIT 5)

    Das funktioniert leider nicht. Eine Idee wie ich es hinbekommen kann?

    Beste Grüße
    Viper

    • Offizieller Beitrag
    SQL
    SELECT  id
    FROM    table
    WHERE   id IN (
                SELECT    id
                FROM      table
                ORDER BY  foo DESC
                LIMIT     5
            )
    ORDER BY date DESC

    Der äußere Query ist "optional", da dieser nur die Sortierung nach date durchführt. Aggregatsfunktionen wie z. B. MAX() sind für ein Einsatz mit GROUP BY geeignet, bei einer reinen Sortierung ist ORDER BY das geeignete Werkzeug.

  • SQL
    SELECT  id
    FROM    table
    WHERE   id IN (
                SELECT    id
                FROM      table
                ORDER BY  foo DESC
                LIMIT     5
            )
    ORDER BY date DESC

    Der äußere Query ist "optional", da dieser nur die Sortierung nach date durchführt. Aggregatsfunktionen wie z. B. MAX() sind für ein Einsatz mit GROUP BY geeignet, bei einer reinen Sortierung ist ORDER BY das geeignete Werkzeug.

    Das führt bei mir zu einem Error: Fatal error: Uncaught Error: Call to a member function execute() on boolean

    Beste Grüße
    Viper

  • Das klingt nach fehlerhaftem PHP-Code ;)

    PHP
    $stmt = $db->prepare("SELECT ID FROM serverpreise WHERE ID IN (SELECT ID FROM serverpreise ORDER BY golderz DESC LIMIT 21) ORDER BY date DESC");
    $stmt->execute();
    $stmt->get_result();
    var_dump($stmt);
    die();

    Wenn ich das LIMIT 21 weglasse, dann funktioniert es, aber zeigt mir halt die falsche ID an.

    Beste Grüße
    Viper

  • Warum nicht einfach:

    SQL
    SELECT ID
    FROM serverpreise
    ORDER BY golderz DESC, date DESC
    LIMIT 5

    Zu erwähnen sei, dass je nach verwendeten Framework, in deinem Fall also $stmt möglicherweise LIMIT seperat behandelt werden muss, z.B. $stmt->setLimit(5) und aus der Query entfernt wird, bzw. zu Fehlern führt.

    VG

    Fr33chen

  • Warum nicht einfach:

    SQL
    SELECT ID
    FROM serverpreise
    ORDER BY golderz DESC, date DESC
    LIMIT 5

    Zu erwähnen sei, dass je nach verwendeten Framework, in deinem Fall also $stmt möglicherweise LIMIT seperat behandelt werden muss, z.B. $stmt->setLimit(5) und aus der Query entfernt wird, bzw. zu Fehlern führt.

    Auch das führt leider nicht zum richtigen Ergebnis :/

    In meinem Fall muss LIMIT in der Query bleiben. Funktioniert bei allen anderen Querys auch.

    Beste Grüße
    Viper

  • Sondern?

    Auch das geht über das LIMIT hinaus.

    Hier mal die Tabelle. Es sollten nur die Einträge im Rahmen beachtet werden. Und von den Einträgen muss die ID des Eintrags mit dem höchsten Wert bei golderz ermittelt werden. Ab er er gibt mir ID = 35 zurück und die liegt außerhalb. Oder habe ich hier einen Denkfehler?

    SQL
    SELECT ID FROM serverpreise ORDER BY golderz DESC, date DESC LIMIT 21

    Beste Grüße
    Viper

  • Hier mal die Tabelle. Es sollten nur die Einträge im Rahmen beachtet werden.

    Diese Einschränkung erschließt sich mir nicht - warum nur die Ergebnisse im Rahmen? An welchem Wert machst du das fest?

    Das lese ich weder aus der Tabelle noch aus deinen Posts heraus.

    VG

    Fr33chen

  • Richtig.

    Ich möchte die Einträge der letzten 21 Tage haben.

    Natürlich könnte ich es auch via PHP machen, aber da fehlt mir aktuell die Idee für^^

    Beste Grüße
    Viper

  • Ich möchte die Einträge der letzten 21 Tage haben.

    Dann eventuell so:

    SQL
    SELECT ID
    FROM serverpreise
    WHERE date > X
    ORDER BY golderz DESC, date DESC
    LIMIT 5

    X muss natürlich entsprechend ersetzt werden.

    VG

    Fr33chen

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!