Zwei Abfragen zu einer mit Inner Join
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
anschauen
ansehen
ausgabe
code
datenbanksystem
definieren
ding
ermitteln
formulieren
jemand
leere ausgabe
leute
level
optimieren
problem
sicherheit
update
verzichten
zugreifen
-
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?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
Wir haben einen Anfrageoptimierer?
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. -
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 ... -
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? -
Naja, bei UPDATE, INSERT und DELETE kann man ja nicht allzu viel optimieren... ich glaub daher eher nicht, dass es geht.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage