Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Höchster Wert bei Mehrfacheinträgen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Nobima, 19 Dezember 2015.

  1. Nobima

    Nobima Benutzer

    Guten Tag,
    Ein Tabelle mit zwei Feldern soll abgefragt werden. Den Angaben in Feld 1 sind Werte zugeordnet, die in Feld 2 stehen. Die Angaben in Feld 1 können mehrfach vorhanden sein, aber unterschiedliche Werte in Feld 2 haben. Als Ergebnis der Abfrage sollen nur die Angaben aus Feld 1 gezeigt werden, die den höchsten Wert in Feld 2 haben.

    Ist:
    A-5
    B-3
    C-4
    B-2
    D-1
    B-4

    Soll:
    A-5
    B-4
    C-4
    D-1


    Vielen Dank für einen Tip !
     
  2. Nobima

    Nobima Benutzer

    Ich muss noch ergänzen, dass Feld 1 per INNER JOIN aus einer anderen Tabelle geholt wird.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Du suchst select col1, max(col2) from ... group by col1. Ob das aus einem Join oder sonstwoher kommt ist irrelevant.
     
  4. Nobima

    Nobima Benutzer

    Entsprechend Deines Hinweises funktioniert folgende Abfrage:

    SELECT bearbeitungsstand.Mitarbeiter_Id, themen.Thema_Nr, bearbeitungsstand.Stand, MAX(bearbeitungsstand.Jahr)
    FROM bearbeitungsstand INNER JOIN themen ON bearbeitungsstand.Thema_Id = themen.Themen_Id
    WHERE bearbeitungsstand.Stand='erledigt' AND bearbeitungsstand.Mitarbeiter_Id = 31
    GROUP BY themen.Thema_Nr

    Wobei Feld 1 = themen.Thema_Nr und Feld 2 = bearbeitungsstand.Jahr.

    Zwischenzeitlich hatte ich auch folgende (recht unübersichtliche) Abfrage anhand von Foren-Einträgen
    zusammengebastelt:

    SELECT a.Mitarbeiter_Id, c.Thema_Nr, a.Stand, a.Jahr
    FROM bearbeitungsstand a INNER JOIN themen c ON a.Thema_Id = c.Themen_Id
    WHERE a.Stand='erledigt' AND a.Mitarbeiter_Id = 31
    AND a.Jahr = (
    SELECT MAX(b.Jahr)
    FROM bearbeitungsstand b INNER JOIN themen d ON b.Thema_Id = d.Themen_Id
    WHERE c.Thema_Nr = d.Thema_Nr
    )

    Deine Lösung gefällt mir jedoch viel besser !
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Das ist allerdings fehlerhaft. Alle (!) Spalten des Resultates müssen entweder aggregiert oder gruppiert werden. Das ist bei Dir nicht der Fall. Du erhälst mehr oder weniger ein zufälliges Ergebnis. Ab MySQL 5.7 sowie in allen anderen richtigen Datenbanken dieser Welt wird obige Abfrage schlicht und ergreifend einen Syntaxfehler bringen, mehr nicht.

    Um das mal zu zeigen:

    Code:
    mysql> select * from tooore;
    +---------+-------+------+
    | spieler | spiel | tore |
    +---------+-------+------+
    | max  |  1 |  4 |
    | max  |  2 |  3 |
    | max  |  3 |  6 |
    | lutz  |  1 |  6 |
    | lutz  |  2 |  8 |
    +---------+-------+------+
    5 rows in set (0.05 sec)
    
    mysql> select spieler, spiel, max(tore) from tooore group by spieler;
    +---------+-------+-----------+
    | spieler | spiel | max(tore) |
    +---------+-------+-----------+
    | lutz  |  1 |  8 |
    | max  |  1 |  6 |
    +---------+-------+-----------+
    2 rows in set (0.04 sec)
    
    Lutz hat in Spiel 2 seine 8 Tore gemacht, max in Spiel 3. Es wird aber falsch angezeigt, daß es in Spiel 1 gewesen wäre. Das ist schlicht und einfach Müll.
     
  6. Nobima

    Nobima Benutzer

    Kann ich aus Deiner Antwort entnehmen, dass die Verwendung der Abfrage 2 richtig wäre ?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Vielleicht. Ohne die Tabellen jetzt so richtig zu kennen schwer zu sagen.
     
  8. Nobima

    Nobima Benutzer

    Vielen Dank für Deine Hilfestellung !
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden