kostenloser Webspace werbefrei: lima-city


Zwei Abfragen zu einer mit Inner Join

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    fr3z3r

    fr3z3r hat kostenlosen Webspace.

    Hallo,
    ich hab mal wieder ein Problem...
    $sql = "SELECT ".  
        "EP, Level ".  
        "FROM ".  
        "States ".  
        "WHERE ".    
        "(ID = '".$_SESSION["user_id"]."')";  
    $result = mysql_query ($sql);
    $data = mysql_fetch_array ($result);
    
    $sql = "SELECT ".  
        "EP ".  
        "FROM ".  
        "Level ".  
        "WHERE ".   
        "(EP > '".$data["EP"]."')";  
    $result2 = mysql_query ($sql);
    $data2 = mysql_fetch_array ($result2);
    
      if (mysql_num_rows ($result2) > 0) {
        echo '<center>EP: '.$data["EP"].' / '.$data2["EP"].'<hr style="border-style:solid; border-width:1px; border-color:black; width:140px;"></center>';
      } else {
        echo '<center>EP: '.$data["EP"].'<hr style="border-style:solid; border-width:1px; border-color:black; width:140px;"></center>';
      }
      echo '<center>Level: '.$data["Level"].'<hr style="border-style:solid; border-width:1px; border-color:black; width:140px;"></center>';


    Wenn ich mit diesem Code die Ausgabe mache funktioniert alles Wunderbar un ich bekomme als Ausgabe:
    EP: 0 / 250
    Level: 1



    Nun möchte ich aber gerne auf die zweite Abfrage verzichten und habe die Abfrage so umgeschrieben:
    $sql = "SELECT ".  
        "States.EP, States.Level, Level.EP ".  
        "FROM ".  
        "States Inner Join Level ".
        "On States.EP > '".$data["EP"]."' ".
        "WHERE ".    
        "(States.ID = '".$_SESSION["user_id"]."')";  
    $result = mysql_query ($sql);
    $data = mysql_fetch_array ($result);
    
      if (mysql_num_rows ($result) > 0) {
        echo '<center>EP: '.$data["States.EP"].' / '.$data["Level.EP"].'<hr style="border-style:solid; border-width:1px; border-color:black; width:140px;"></center>';
      } else {
        echo '<center>EP: '.$data["States.EP"].'<hr style="border-style:solid; border-width:1px; border-color:black; width:140px;"></center>';
      }
      echo '<center>Level: '.$data["States.Level"].'<hr style="border-style:solid; border-width:1px; border-color:black; width:140px;"></center>';


    Doch nun bekomm ich nur eine leere Ausgabe:
    EP:
    Level:


    Sieht jemand den Fehler auf die schnelle oder ist einfach die Ausgabe mit $data["States.EP"] falsch?


  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Also, beim Thema Ausgabe bin ich mir nicht so sicher ob das geht. Ich würde lieber zur Sicherheit Aliase definieren. Das geht wie folgt:
    SELECT States.EP as SEP ...
    Jetzt kannst du mit $data['SEP'] darauf zugreifen.

    Aber dein Query ist anicht ganz korrekt. Ich habe es jetzt so verstanden, dass du ermitteln willst wie viel Ep man fürs nächste Level braucht. Du gehts aber an die Dache falsch ran. Du siehst nähmlich welche Einträge mehr haben und liest nur den ersten aus. Viel einfacher wäre es jedoch, wenn du einfach die EP von States.Level +1 ausliest. Das hat das slebe Ergebniss, nur das du es elegante machst, der Query schneller ausgefürt wird und du dann auch beide Querys zusammenführen kannst.
    Also, wie ich dann den Query formulieren würde:
    SELECT s.EP as EP, s.Level as Level,
    (SELECT l.EP
    FROM Level l
    WHERE l.Level = s.Level+1) 
    as next_level_EP
    FROM
    States s
    WHERE
    s.ID = ...ID...;

    Das ist jetzt kein Join sondern ein Subquery, zudem ein ganz böser da ich auf die äußere Tabelle zugreife. Aber dir gehts ja nicht so sehr um Performence, oder? Zudem ham wir ja einen Anfrageoptimierer :D

    Beitrag zuletzt geändert: 25.4.2009 21:27:08 von nikic
  4. Autor dieses Themas

    fr3z3r

    fr3z3r hat kostenlosen Webspace.

    Wir haben einen Anfrageoptimierer? :wow:
    Kannst du mir maln Link oder so dazu geben? xD

    Ich habs jetzt so gelöst:
    $sql = "SELECT ".   
        "States.EP, States.Level, MIN(Level.EP) ".   
        "FROM ".   
        "States INNER JOIN Level ". 
        "On Level.EP > States.EP ". 
        "WHERE ".     
        "(States.ID = '".$_SESSION["user_id"]."') GROUP BY States.ID";  
    $result = mysql_query ($sql);
    $data = mysql_fetch_array ($result);


    Das mit dem Aliase definieren werde ich mir mal Anschauen.
    Vielen Dank trotzdem für deine Mühe.
  5. Natürlcih, jedes Datenbanksystem hat einen Anfrageoptimierer!
    Die Querys von den meisten Leuten würden ohne das Ding sicherlich 10-Mal lahmer werden :D

    Du kannst dir die vorgehensweise der Optimierers mit einem EXPLAIN ansehen. Also:
    EXPLAIN SELECT ...
  6. Autor dieses Themas

    fr3z3r

    fr3z3r hat kostenlosen Webspace.

    nikic schrieb:
    Natürlcih, jedes Datenbanksystem hat einen Anfrageoptimierer!
    Die Querys von den meisten Leuten würden ohne das Ding sicherlich 10-Mal lahmer werden :D

    Du kannst dir die vorgehensweise der Optimierers mit einem EXPLAIN ansehen. Also:
    EXPLAIN SELECT ...


    Ok gar nicht gewusst ^^' Man lernt immer dazu :)
    Geht das mit dem EXPLAIN auch für UPDATE usw?
  7. Naja, bei UPDATE, INSERT und DELETE kann man ja nicht allzu viel optimieren... ich glaub daher eher nicht, dass es geht.
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!