[MySQL] Formulierung von Query gesucht

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MySQL] Formulierung von Query gesucht

    Hallo erstmal!

    ich versuche gerade bestimmte Daten so auszulesen, dass ich weder unzählige Queries brauche, noch alles mögliche aus der DB hole und erst in PHP filtere. Allerdings stehe ich gerade ziemlich auf dem Schlauch.

    Es geht um ein Fussball-Tippspiel.

    Die relevaten Tabellen:

    1. "users": Hier sind die Felder 'id' und 'points' relevant. points stellt die Anzahl der Punkte dar, die der user insgesamt gewonnen hat bisher.

    2. "matches": Hier ist die id relevant und der status, welcher für folgendes vorhaben auf "finished" stehen muss. Die Tabelle ansich repräsentiert die eínzelnen Spiele der Mannschaften.

    3. "wetten": hier sind user-id und match-id relevant, wobei die user-id den ids aus 1. entspricht und match-id den ids aus 2. Zusätzlich gibt es noch ein Feld credits. Dieses beschreibt, wieviel punkte der user in diesem speziellen match bekommen hat. Im Gegensatz zu den points aus 1. sind diese Werte nicht numerisch, sondern Konstanten wie "win", "loss".


    Was getan werden soll:

    Von den besten 10 Usern (= den 10 mit den meisten Punkten) soll ermittelt werden, wie oft sie in den letzten 10 matches (= neusten 10 matches mit status = finished) die Konstanten win oder loss erhalten haben, genau gesagt für jeden einzelnen.


    Da das Skriptergebnis gecacht wird, ist die Performance ziemlich zweitrangig, aber was mir bisher so einfiel ist trotz dessen unter aller sau.

    Ich hätte es simpel gehalten und 3 Queries gebaut. Der erste holt die besten 10 User (Select id from users order by points desc limit 0,10), der zweite holt die letzten 10 matches (select id form matches where status = closed order by date desc limit 0,10)... tjo und da ich die Daten jetzt in PHP habe, wäre der dritte ja kein Problem mehr... dachte ich. Das wäre dann für jeden user alle matches durchgehen und die credits fetchen -> 2 verschachtelte foreach-Schleifen mit einem Query in der Mitte.. (select credits from wetten where userid = ? and matchid = ?). Rein logisch betrachtet sicherlich richtig, aber da wäre ich ja bei 100 Queries.

    Wie würdet ihr das lösen?

    Danke!

  • #2
    Hallo,

    versuch's mal mit unkorrelierten Unterabfragen:

    Code:
    select *
    from wetten
    join (select * from users ... limit 10) as user_top10
        on ...
    join (select * from matches ... limit 10) as match_top10
        on ...
    ...
    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Vielen Dank schonmal. Sowas hatte ich mir auch schon überlegt, allerdings scheint es so zu sein, dass der LIMIT-Befehl in Subqueries nicht erlaubt ist - oder hat sich das mittlerweile geändert? (Google mit "subquery limit" ist voll davon). Das hat mich bisher davon abgehalten.

      Kommentar


      • #4
        Zitat von INC. Beitrag anzeigen
        der LIMIT-Befehl in Subqueries nicht erlaubt ist
        Das stimmt so nicht und wenn, dann nur für korrelierte Unterabfragen, aber die meide ich sowieso wo immer es geht.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Hatte erst heute Zeit mich wieder damit zu beschäftigen, nochmal danke.

          Also ich habe noch nicht ganz verstanden, wie das ganze verknüpft werden muss. Was zurückgegeben soll (pro Fetch-"Durchlauf" bzw. Zeile) ist die id aus der Tabelle users und daneben noch den credit.

          Das heißt man müsste wohl direkt das select anpassen... muss ich außerdem in den subquerys alles holen, wenn ich nur die id brauche?

          Eventuell kannst du mir hier etwas auf die Sprünge helfen, mein jämmerlicher Versuch:

          Code:
          select w.credit, user_top10.id
          from wetten w
          join (select * from users order by points desc limit 10) as user_top10
              on //..?
          join (select * from matches where status = 'closed' order by date desc limit 10) as match_top10
              on //...?

          Kommentar


          • #6
            Hier kommen jetzt deine Fremdschlüsselspalten zum Einsatz, aber ich weiß nicht, wie die heißen, daher ist das nur geraten:

            Code:
            select w.credit, user_top10.id
            from wetten w
            join (select * from users order by points desc limit 10) as user_top10
                on user_top10.id = w.user_id
            join (select * from matches where status = 'closed' order by date desc limit 10) as match_top10
                on match_top10.id = w.match_id;
            Weitere Infos gibt's im MySQL Manual unter „JOIN Syntax“.

            Gruß,

            Amica
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar

            Lädt...
            X