Ankündigung

Einklappen
Keine Ankündigung bisher.

Top 3 mit der Abfragen aus 2 Tabelle

Einklappen

Neue Werbung 2019

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

  • Top 3 mit der Abfragen aus 2 Tabelle

    Huhu,

    bin gerade neu hier und ja, ich hab ein Problem
    Ich möchte gerne folgende so haben:

    Tabelle tipp_user
    user_id | games_id | tipp1 | tipp2
    1 | 1 | 0 | 1
    1 | 2 | 2 | 2
    1 | 3 | 1 | 0
    2 | 1 | 1 | 1
    2 | 2 | 2 | 0

    Tabelle tipp_games
    games_id | tipp1 |tipp2
    1 | 0 | 1
    2 | 2 | 0
    3 | 1 | 0

    Und zwar soll es geprüft werden, mit Tipp von user und games und daraus die Top 3 machen, wer die meisten richtige Tipp hat.

    Momentan habe ich so weit geschaft, wie viele richtige Tipp insgesamt es gibt:
    Code:
    SELECT * FROM tipp_user WHERE EXISTS(SELECT * FROM tipp_games WHERE tipp_user.games_id = tipp_games.id AND tipp_user.tipp1 = tipp_games.tipp1 AND tipp_user.tipp2 = tipp_games.tipp2)
    Mir fehlt nur noch, dass es noch geordnet ist nach User ID und daraus ein Toplist, wäre z.B. so:
    1. UserID 1 mit 2 richtige Tippen
    2. UserID 2 mit 1 richtige Tippen

    Nur das Problem ist, wie kann ich nach UserID kategorien?

    Danke! MfG Micki


  • #2
    Hier deine Query nochmal formatiert, sodass man sie einfacher lesen kann:
    Code:
    SELECT * 
    FROM tipp_user 
    WHERE EXISTS(
        SELECT * 
        FROM tipp_games 
        WHERE tipp_user.games_id = tipp_games.id 
            AND tipp_user.tipp1 = tipp_games.tipp1 
            AND tipp_user.tipp2 = tipp_games.tipp2
    )
    Eigentlich hast du damit schon das wichtigste. Das gibt nicht, wie du sagst an, "wie viele richtige Tipp insgesamt es gibt", sondern es gibt alle gültigen Tipps der User zurück.

    Das heißt die musst du nur noch zählen:
    Code:
    SELECT userid, COUNT(userid) AS anzahl
    FROM <query_von_eben>
    GROUP BY userid
    ORDERBY anzahl DESC
    Die ersten drei Ergebnisse sind die mit den meisten richtigen Tipps.

    Kommentar


    • #3
      Versuch mal die Query mit JOIN zu machen, ist für die Datenbank einfacher als diese Verschachtelte.

      Das Ranking kannst du am Ende dann mittels COUNT, GROUPBY und ORDER machen
      mysql ist veraltet Mails senden: Ohne Probleme und ohne mail()
      PHP-Code:
      echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>'

      Kommentar


      • #4
        Huhu, ich komme nun nicht mehr weiter... o.o

        PHP-Code:
        <?php 
            $checking 
        mysql_query("SELECT * FROM tipp_user WHERE EXISTS(SELECT * FROM tipp_games WHERE tipp_user.games_id = tipp_games.id AND tipp_user.tipp1 = tipp_games.tipp1 AND tipp_user.tipp2 = tipp_games.tipp2)");
            
        $checkingtop3 mysql_query("SELECT user_id, COUNT(user_id) AS anzahl FROM ".$checking." GROUP BY user_id ORDERBY anzahl DESC LIMIT 3");
            while(
        $sql mysql_fetch_assoc($checkingtop3)){
             echo 
        'UserID: '.$checkingtop3['user_id'].' mit X richtige Tippen<br/>';
            }
        Da ist schon was falsch, darüber habe ich wirklich null Ahnung wie es aufgebaut werden soll, ist mir neu

        Danke! MfG Micki

        Kommentar


        • #5
          Der Grundquery, der deine super lange Variante mit EXISTS ersetzt:
          Code:
          SELECT * FROM
          tipp_user NATURAL JOIN tipp_games
          Zusammengesetzt:
          Code:
          SELECT user_id, COUNT(user_id) AS anzahl
          FROM (
              SELECT * FROM
              tipp_user NATURAL JOIN tipp_games
          ) richtigeTipps
          GROUP BY user_id
          ORDER BY anzahl DESC
          Sorry es heißt natürlich ORDER BY statt wie ich zuerst geschrieben hatte ORDERBY.
          Wichtig ist auch, dass man dem Sub-Query einen eigenen Namen (z. B. richtigeTipps) geben muss.

          Kommentar


          • #6
            //Edit

            Hat sich erledigt. Danke!

            Kommentar

            Lädt...
            X