DennisKreiss: mysql select

Hallo, ich besitze eine mysql-tabelle in Ergebnisse von mehreren Sportfesten enthält. Die wichtigsten Spalten sind dabei die Athleten, die Disziplinen und die verschiedenen Ergebnisse. Wie muss ich nun eine select-Abfrage formulieren, damit ich nur die jeweiligen besten Ergebnisse der verschiedenen Disziplinen der Athleten erhalte?

Danke für die Hilfe,
Dennis

  1. Hello,

    Hallo, ich besitze eine mysql-tabelle in Ergebnisse von mehreren Sportfesten enthält. Die wichtigsten Spalten sind dabei die Athleten, die Disziplinen und die verschiedenen Ergebnisse. Wie muss ich nun eine select-Abfrage formulieren, damit ich nur die jeweiligen besten Ergebnisse der verschiedenen Disziplinen der Athleten erhalte?

    Das klingt, alleine von der spärlichen Beschreibung, nach einer nicht ganz trivialen Abfrage - offen sind z.B. Fragestellungen wie "wie viele beste Ergebnisse".
    Bitte zeige uns genau dein Tabellendesign, ein paar Beispieldaten und das gewünschte Ergebnis. Dann können wir dich auf den richtigen Weg bringen.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Let Bygones Be Bygones  --  Robert Pitscottie: "Chronicles of Scotland"
    1. Hello,

      Das klingt, alleine von der spärlichen Beschreibung, nach einer nicht ganz trivialen Abfrage - offen sind z.B. Fragestellungen wie "wie viele beste Ergebnisse".
      Bitte zeige uns genau dein Tabellendesign, ein paar Beispieldaten und das gewünschte Ergebnis. Dann können wir dich auf den richtigen Weg bringen.

      MfG
      Rouven

      Dann versuche ich mal eine Beispieltabelle zu zeigen:

      athlet    disziplin      ergebnis

      max       weitsprung     3.41
      stefan    weitsprung     4.41
      max       hochsprung     1.15
      karl      hochsprung     1.18
      max       weitsprung     5.52
      max       weitsprung     2.31
      stefan    hochsprung     1.15
      stefan    hochsprung     1.20
      max       weitsprung     4.72

      Zu einem Athleten gibt es also eine beliebige Anzahl von Ergebnissen, so dass eine einzelne Disziplin gar nicht, nur einzeln oder mehrfach vorkommen kann. Als Ergebnis hätte ich jetzt gerne nur die Bestleistungen jeder Disziplin von jedem Athleten, also in etwa folgendes:

      stefan    hochsprung     1.20
      karl      hochsprung     1.18
      max       hochsprung     1.15
      max       weitsprung     5.52
      stefan    weitsprung     4.41

      Die Ausgabe sollte am Besten noch nach den Disziplinen und der Leistung sortiert sein. Zurzeit frage ich jede Disziplin jedes Athleten einzeln ab und speichere das beste Ergebnis in einer zweiten Tabelle, aber das kann ja nicht die Lösung sein...

      Gruß, Dennis

      1. Hallo,

        » Bitte zeige uns genau dein Tabellendesign, ein paar Beispieldaten und das gewünschte Ergebnis. Dann können wir dich auf den richtigen Weg bringen.

        Dann versuche ich mal eine Beispieltabelle zu zeigen:

        athlet    disziplin      ergebnis

        max       weitsprung     3.41
        stefan    weitsprung     4.41
        max       hochsprung     1.15
        karl      hochsprung     1.18
        max       weitsprung     5.52
        max       weitsprung     2.31
        stefan    hochsprung     1.15
        stefan    hochsprung     1.20
        max       weitsprung     4.72

        Gewünschtes Ergebnis

        --------------------------------

        stefan    hochsprung     1.20
        karl      hochsprung     1.18
        max       hochsprung     1.15
        max       weitsprung     5.52
        stefan    weitsprung     4.41

        wie ich bereits vermutete, suchst Du eine korrelierte Unterabfrage.

        Freundliche Grüße

        Vinzenz

  2. Hallo,

    Hallo, ich besitze eine mysql-tabelle in Ergebnisse von mehreren Sportfesten enthält. Die wichtigsten Spalten sind dabei die Athleten, die Disziplinen und die verschiedenen Ergebnisse. Wie muss ich nun eine select-Abfrage formulieren, damit ich nur die jeweiligen besten Ergebnisse der verschiedenen Disziplinen der Athleten erhalte?

    vermutlich benötigst Du eine korrelierte Unterabfrage, siehe z.B. diesen Archivbeitrag.

    Freundliche Grüße

    Vinzenz

  3. Hi,

    Hallo, ich besitze eine mysql-tabelle in Ergebnisse von mehreren Sportfesten enthält. Die wichtigsten Spalten sind dabei die Athleten, die Disziplinen und die verschiedenen Ergebnisse. Wie muss ich nun eine select-Abfrage formulieren, damit ich nur die jeweiligen besten Ergebnisse der verschiedenen Disziplinen der Athleten erhalte?

    Du willst also nach Athlet und Disziplin gruppieren. Und dann das max-Ergebnis ausgeben.

    Wobei das natürlich kompliziert wird. Während z.B. bei Sprung-/Wurf-Disziplinen das beste Ergebnis das mit dem höchsten Wert ist, ist es bei Lauf-Disziplinen das mit dem niedrigsten Wert ...
    Noch interessanter wird es z.B. bei Tischtennis o.ä.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi,

      Du willst also nach Athlet und Disziplin gruppieren. Und dann das max-Ergebnis ausgeben.

      Wobei das natürlich kompliziert wird. Während z.B. bei Sprung-/Wurf-Disziplinen das beste Ergebnis das mit dem höchsten Wert ist, ist es bei Lauf-Disziplinen das mit dem niedrigsten Wert ...
      Noch interessanter wird es z.B. bei Tischtennis o.ä.

      cu,
      Andreas

      Ja genau, es handelt sich um Leichtathletikdisziplinen, wo je nach Disziplin auf- oder absteigend sortieren muss. Da aber zunächst erst alle Laufdisziplinen und dann die technischen Disziplinen ausgeben werden, könnte ich hier auch mit 2-3 Abfragen leben, damit es nicht alzu kompliziert wird.

      Gruß, Dennis

      1. Hi,

        »» Du willst also nach Athlet und Disziplin gruppieren. Und dann das max-Ergebnis ausgeben.

        Ja genau, es handelt sich um Leichtathletikdisziplinen, wo je nach Disziplin auf- oder absteigend sortieren muss. Da aber zunächst erst alle Laufdisziplinen und dann die technischen Disziplinen ausgeben werden, könnte ich hier auch mit 2-3 Abfragen leben, damit es nicht alzu kompliziert wird.

        Du könntest auch Min und Max der gruppierten Ergebnisse auswählen, und dann bei der Auswertung des Ergebnisses abhängig von der Disziplin entweder Min (Zeitdisziplinen) oder Max (Wurf, Sprung) benutzen.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hallo Andreas,

          Du könntest auch Min und Max der gruppierten Ergebnisse auswählen, und dann bei der Auswertung des Ergebnisses abhängig von der Disziplin entweder Min (Zeitdisziplinen) oder Max (Wurf, Sprung) benutzen.

          stimmt, man benötigt eine UNION von korrelierten Unterabfragen :-)

          Gib mir
              Name,
              Disziplin
              erzielte Leistung
          aus
              der Tabelle
          wobei
              die Leistung gleich
                  dem Maximalwert der Leisung
                  aus
                      der Tabelle
                  wobei
                      Name und Disziplin übereinstimmen
                  und
                      die Disziplin in der Liste der Disziplinen mit maximalem Ergebnis
                      enthalten ist (Wurf- und Sprung).
          vereinigt mit
          Gib mir
              Name,
              Disziplin
              erzielte Leistung
          aus
              der Tabelle
          wobei
              die Leistung gleich
                  dem Minimalwert der Leisung
                  aus
                      der Tabelle
                  wobei
                      Name und Disziplin übereinstimmen
                  und
                      die Disziplin in der Liste der Disziplinen mit minimalem Ergebnis
                      enthalten ist (Laufdisziplinen, Gehen)

          Vorgehen grundsätzlich wie im von mir verlinkten Beitrag.

          Freundliche Grüße

          Vinzenz

          1. Hi,

            stimmt, man benötigt eine UNION von korrelierten Unterabfragen :-)

            Nö. Da nur Name, Disziplin und Ergebnis gefragt sind, braucht mahn die korrelierten Unterabfragen nicht, da reicht group by.

            Die k.U. würden nur dann benötigt, wenn weitere Spalten gebraucht würden.

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
            1. yo,

              Hi,

              »» stimmt, man benötigt eine UNION von korrelierten Unterabfragen :-)

              Nö. Da nur Name, Disziplin und Ergebnis gefragt sind, braucht mahn die korrelierten Unterabfragen nicht, da reicht group by.

              Die k.U. würden nur dann benötigt, wenn weitere Spalten gebraucht würden.

              mal als hinweis, auf den ersten blick mögen die beiden wege (korrelierte unterabfrage und GROUP BY) gleich sein, sind es aber definitiv nicht. welche von beiden eingesetzt werden soll, dazu braucht es mehr info des hilfesuchenden. man kann also noch nicht genau sagen, ob korreliert oder mit GROUP BY.

              zum anderen kann man es auch mit CASE lösen und muss nicht unbedinkt ein UNION ALL verwenden.

              Ilja

            2. Hallo Andreas,

              » stimmt, man benötigt eine UNION von korrelierten Unterabfragen :-)

              Nö. Da nur Name, Disziplin und Ergebnis gefragt sind, braucht mahn die korrelierten Unterabfragen nicht, da reicht group by.

              typische Bestenlisten enthalten außerdem noch Datum und Veranstaltung/Ort, da reicht GROUP BY nicht mehr. Für die angeführten drei Spalten reicht in der Tat GROUP BY.

              Freundliche Grüße

              Vinzenz

              1. Hallo Andreas,

                »» » stimmt, man benötigt eine UNION von korrelierten Unterabfragen :-)
                »»
                »» Nö. Da nur Name, Disziplin und Ergebnis gefragt sind, braucht mahn die korrelierten Unterabfragen nicht, da reicht group by.

                typische Bestenlisten enthalten außerdem noch Datum und Veranstaltung/Ort, da reicht GROUP BY nicht mehr. Für die angeführten drei Spalten reicht in der Tat GROUP BY.

                Freundliche Grüße

                Vinzenz

                Hallo,

                danke für eure Hilfe. Ich merke schon, je ausführlicher man sein Problem beschreibt desto besser kann einem geholfen werden.

                Aber für mich kommen wohl nur die korrellierten Unterabfragen in Frage, da die Tabelle noch weitere Spalten (wie Datum, Ort, Freiluft/Halle, Wind, Zusatzleistung, usw.) enthält. Zudem ist das abzufragende Ergebnis bei Läufen auf mehrere Spalten verteilt (also auf Stunden, Minuten, Sekunden und Hundertstel)
                Eine erste Version kann man sich unter http://www.sce-hamm.de/bestenliste_2008.php anschauen. Hier durchsuche ich noch jede Disziplin einzeln, wähle immer das beste Ergebnis mit der LIMIT Funktion aus und schreibe das Ergebnis (falls vorhanden) in eine zweite Tabelle. Sicherlich nicht die schönste Art und Weise ;-) und bei 700 Athleten und 12000 Ergebnissen dauert das mittlerweile schon recht lange. :-( => Also muss ich mir mal ein paar neue Abfragen zusammenbasteln.

                1. yo,

                  Hier durchsuche ich noch jede Disziplin einzeln, wähle immer das beste Ergebnis mit der LIMIT Funktion aus und schreibe das Ergebnis (falls vorhanden) in eine zweite Tabelle. Sicherlich nicht die schönste Art und Weise ;-) und bei 700 Athleten und 12000 Ergebnissen dauert das mittlerweile schon recht lange. :-( => Also muss ich mir mal ein paar neue Abfragen zusammenbasteln.

                  sehr unschön der weg, zumal man deine aufgabe sehr gut in einer einzigen abfrage lösen kann und das ganz ohne es in einer zwischentabelle zu speichern. aber noch mal mein hinweis, dass sich die beiden methoden mit GROUP BY und die korrelierte unterabfrage unterscheiden und das nicht nur, weil du mehr spalten anzeigen willst.

                  das kniffilige besteht in den spezialfällen, zum beispiel muss du dir gedanken machen, was du machen willst, wenn ein und derselbe sportler mehr als einmal das gleiche höchstergebnis geschafft hat. das kann zum beispiel sein, wenn ein weitspringer zweimal die marke 8,65 m gesprungen ist. willst du dann beide ergebnisse anzeigen und wenn nur eines, welches der mehreren, eventuell das zuerst erreicht. aber das sind dinge, die man eben dabei beachten muss und deren fachlichkeit du uns noch verraten musst.

                  Ilja