ich komm mit dieser Sql abfrage nicht klar

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

  • ich komm mit dieser Sql abfrage nicht klar

    Hallo leute ...

    Ich hab vor mit PHP und einer SQL DB so eine Art tippspiel zu machen ...

    Habe aber folgendes problem:

    Ich habe 2 Tabellen.
    Die eine Tabell enthält Infos über die Fahrer
    Tab: f1_Driver
    Spalten: DriverID, DriverName ...

    Die andere liefert informationen über ein einzelnes Rennen:
    Tab: f1_Race
    Spalten:
    RaceID, Pos1ID, Pos2ID, Pos3ID ...

    Wenn ein Rennen gelaufen ist, werden die Daten in die Tabelle f1_Race eigetragen (die DriverID der Jeweiligen pos)...

    Was ich nun möchte, ist eine Liste der Fahrer mit der Anzahl der gewinne der Jeweiligen Pos ...


    Hab ich die Tabellen falsch entworfen ,, ????

    Kann mir bitte jemand helfen !!!

    mfg boggi

  • #2
    mach ne Zwischentabelle mit Renn-ID, Fahrer-ID und Platz als einzigen Feldern. Da notierst du dann die Plätze; dann wird die Abfrage auch einfacher.

    (Mit ein wenig Geschick kann man dann jeweils FahrerWertung und Teamwertung in je einer Query abfragen!)
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      so ... ich hab die Tabs angelegt ...

      könnt ihr mir bei der Query helfen ??

      Kommentar


      • #4
        schiddebön:
        Code:
        select f.*, p.Place, count(p.*) as Anzahl from f1_Driver f
          left join f1_Place p on p.DriverID=f.DriverID
          group by p.DriverID, p.Place
          order by f.DriverName, p.Place
        Für Erklärungen zu "left join" und "group" schau mal in die MySQL-Sprachreferenz.

        Am besten legst du in der Tabelle f1_Place noch einen gemeinsamen Index über Place und DriverID, das beschleunigt das Gruppieren noch ein wenig.
        Für eine Saison nicht merklich, aber wenn man in hundert Jahren oder so die Query mal über alle Rennen aller WMs laufen lässt ...
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar


        • #5
          Also ...

          nen bissle spielen und es klappt ....

          Erst ma danke für eure nette Hilfe ... ich finds super Hier....


          Nun aber weiter :

          ich hab die Anweisung ein bissle angepasst:
          Code:
          select f.DriverNumber ,f.DriverName, p.RaceID, t.TeamName, p.Platz,
            sum(p.Points) as Punkte, count('p.*') as Anzahl
            from f1_Teams t
            left join f1_Driver f on f.TeamID=t.TeamID
            left join f1_RaceWinns p on p.DriverID=f.DriverID
            group by p.DriverID
            order by p.Points DESC, f.DriverName, p.RaceID

          aber er gibt mir nich alle Fahrer aus, nur die, die auch in der Winner-Tab stehen... Ich möchte aber gerne alle haben ?!?!? ...

          Wie das lösen ???

          Kommentar


          • #6
            Das liegt vermutlich an deinem group-Parameter.
            Nimm mal f.DriverID statt p.DriverID
            Code:
              group by f.DriverID
            und die Order-Parameter sind so sinniger:
            Code:
              order by 6 desc, f.DriverName
            order by 6 = nach 6. Spalte der Rückgabe sortieren; in diesem Fall sum(p.Points)
            p.RaceID macht keinen Sinn, da die durch das "group by" nicht mehr eindeutig ist - alles mit der gleichen DriverID wird ja zu einer Zeile zusammengefasst!
            mein Sport: mein Frühstück: meine Arbeit:

            Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

            Kommentar


            • #7
              oki ... hat gefunzt ... thx ...

              noch eine offene Frage ...

              Wie speichere Ich am besten die Tipps der User ???

              sie sollen die Plätze 1-6 tippen und entsprechende Punkte bekommen

              Kommentar


              • #8
                Die Tipps kommen genauso wie die Platzierungen in eine Extra-Tabelle (RaceID, DriverID, Platz), nur bekommt die natürlich noch zusätzlich eine UserID als foreign key auf die User-Tabelle.

                Die Query für die Punkte hängt davon ab, wofür es Punkte geben soll und welche Daten du haben willst ... auf jeden Fall wohl die User-Daten und die Punktsumme ...

                select u.*, sum( ... Punktberechnung ...) from f1_Users u
                left join f1_Tipps t on t.UserID=u.ID
                left join f1_RaceWins p on p.RaceID=t.RaceID
                group by u.ID

                Wenn du einfach einen Punkt für jeden exakten Treffer haben willst, dann sieht die Punktberechnung so aus:
                ... if (p.DriverID=t.DriverID and p.Platz=t.Platz, 1, 0) ...


                natürlich kann man noch auf schräge Ideen kommen, aber das meiste lässt sich tatsächlich mit einer Query lösen. Z.B.

                - 3 Punkte für exakten Match, 1 Punkt wenn immerhin Team<->Platz stimmt, 1 Punkt wenn der Fahrer nur eine Position vor oder hinter dem Tipp gelandet ist.
                - man könnte Tipps für Ausfälle und "nicht qualifiziert" entgegennehmen (geht in einer Query wenn die als Sonder-Plätze gespeichert sind - z.B. NULL, 0, oder negative Platzierungen)

                nebenbei: wie ist dein Feld "Platz" definiert?
                mein Sport: mein Frühstück: meine Arbeit:

                Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                Kommentar


                • #9
                  Platz ist als int definiert ...


                  p.s. ich wusste gar nich, das ich auch ne If- Naweisung dareinbasteln kann

                  Kommentar


                  • #10
                    ach noch einer ...


                    bekomme ich mit einer SQL- Abfrage dann auch raus, wer (welcher User) für was getippt hat ??

                    Oder muss ich das schachteln ... in 2 o. 3 Abfragen ?

                    Kommentar


                    • #11
                      nicht gleichzeitig mit der Punktesumme.
                      Aber den Tipp mit den dazugehörigen Punkten kannst du auslesen ... einfach mit einer Kombination aus Platzierung auslesen und Punkteberechnung.

                      Original geschrieben von boggi
                      Platz ist als int definiert ...
                      Platzverschwendung ... mach ein tinyint draus; das reicht immer noch für 127 Fahrer und verbraucht nur ein Byte pro Zeile statt deren vier.
                      mein Sport: mein Frühstück: meine Arbeit:

                      Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                      Kommentar

                      Lädt...
                      X