[PHP] Zwei Abfragen zu einer mit Inner Join

Xot

-
ID: 413078
L
26 November 2006
451
36
Hallo,
ich hab mal wieder ein Problem...
Code:
$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:
Code:
$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?
 
Hi,

Du hast ein kleinen Denkfehler in der Abfrage.
Code:
    "On States.EP > '".$data["EP"]."' ".

"$data" ist bis dahin aber doch garnicht definiert, oder?
 
Args genau... Danke

Gibts da irgend eine andere Möglichkeit das in einer Abfrage zu lösen oder ist dieses Problem wirklich nur mit 2 Abfragen zu lösen?
Hat jemand ne Idee dazu?
 
Das hab ich leider schon ausprobiert aber irgendwie mag der das nicht...
Gibt wieder einen leeren String aus...

Naja dann muss ich das Wohl oder Übel über 2 Abfragen machen...

Trotzdem vielen Dank
 
So schnell würde ich die Flinte nicht ins Korn werfen ;)

PHP:
$sql = "SELECT ".  
    "States.EP, States.Level, MIN(Level.EP) ".  
    "FROM ".  
    "States INNER JOIN Level ".
    "On States.EP > Level.EP".
    "WHERE ".    
    "(States.ID = '".$_SESSION["user_id"]."') GROUP BY States.ID";

Die Frage ist die Performance... Im Prinzip generiert man eine Art Kreuzprodukt und muss das Ganze wieder durch eine Gruppierungsoperation zusammenfassen. Ich denke nochmal über eine bessere Lösung nach. Für den Anfang sollte das aber mal funktionieren. Solange du nicht 10000 Level in deiner Tabelle hast, dürfte die Performance akzeptabel sein.


Greetz

paddya
 
Ganz spontan:

Code:
$sql = "SELECT
		    States.EP, States.Level, Level.EP
		FROM 
		    States 
		INNER JOIN 
			Level
	    On 
	    	Level.EP > States.EP
	    WHERE
			(States.ID = '".$_SESSION["user_id"]."')";

Die Abfrage ist aber definitiv mit einem Join lösbar :)
 
Ganz spontan:

Code:
$sql = "SELECT
		    States.EP, States.Level, Level.EP
		FROM 
		    States 
		INNER JOIN 
			Level
	    On 
	    	Level.EP > States.EP
	    WHERE
			(States.ID = '".$_SESSION["user_id"]."')";

  1. Bedingung im ON-Clause falsch rum :p
  2. Es besteht dann die Möglichkeit, dass es mehrere Level gibt, auf die die Bedingung zutrifft. Im Endeffekt funktioniert das also nicht, weil du mehr als einen Datensatz zurückbekommst ;)
 
@Rene
Deins geht leider nicht wie paddya schon gesagt hat

@paddya
Normalerweise müsste nach der abfrage dann folgendes Ausgegeben werden vom echo "EP: / " doch mit deiner Methode verschwindet auch das / ...

Naja ich werde mich mal in das Thema mit den Group einarbeiten müssen. Trotzdem Danke für Anregung.
 
Bist du dir da sicher? Ich mir nämlich nicht :-?
Schau dir mal die Ausgangquerys an, da wird in "data" auch die EP aus States gespeichert. Deswegen denke ich, dass meine Bedingung gleich rum ist.
Aber wie gesagt, ist grad sehr spontan :biggrin:

Soweit ich meine ist deine ON Bedingung schon richtig :D

@paddya

PHP:
$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";

Hab deine nun auch mal umgestellt und nun ist eigentlich immer noch das selbe Problem das ich als Ausgabe nur

EP: /
Level:

statt

EP: 0 / 250
Level: 1

bekomme...
 
Was gibt denn
PHP:
var_dump($data)
aus?

//Edit:
Hast du das
Code:
echo '<center>EP: '.[COLOR="Red"]$data["EP"][/COLOR].' / '.[COLOR="Red"]$data2["EP"][/COLOR].'<hr style="border-style:solid; border-width:1px; border-color:black; width:140px;"></center>';
auch geändert?
 
Zuletzt bearbeitet:
Checke mal mysql_error(), tausche aber vorher in meiner Version noch "MIN" durch "MAX" aus. Hatte da nen Denkfehler.

Mein Ansatz war folgender: "Aktuelles Level" ist das Level mit der höchsten EP-Anforderung, das jedoch eine geringere Anforderung als die aktuellen EP des Staates hat. Korrekterweise müsste da noch ein ">=" stehen.

Greetz

paddya

Edit: Oh mann... habe das Problem wohl komplett falsch verstanden. Ich überleg nochmal von Anfang an^^
 
Was gibt denn
PHP:
var_dump($data)
aus?

array(6) { [0]=> string(1) "0" ["EP"]=> string(1) "0" [1]=> string(1) "1" ["Level"]=> string(1) "1" [2]=> string(3) "250" ["MIN(Level.EP)"]=> string(3) "250" }

Die Werte die dort drin stehen scheinen ja zu stimmen...
Aber ich kann jetzt damit nicht wirklich etwas Anfangen, wie ich die Werte ausgeben soll.



@paddya
Keine Fehlermeldung von mysql_error. Das Auswechseln probier ich kurz glaub aber eher nicht da die Werte aus vardump ja stimmen.
 
Code:
$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);


  if (mysql_num_rows ($result2) > 0) {
    echo '<center>EP: '.$data[0].' / '.$data[2].'<hr style="border-style:solid; border-width:1px; border-color:black; width:140px;"></center>';
  } else {
    echo '<center>EP: '.$data[0].'<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>';
 
Code:
$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);


  if (mysql_num_rows ($result2) > 0) {
    echo '<center>EP: '.$data[0].' / '.$data[2].'<hr style="border-style:solid; border-width:1px; border-color:black; width:140px;"></center>';
  } else {
    echo '<center>EP: '.$data[0].'<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>';

Funktioniert :)

Vielen Dank euch beiden für die Hilfe.
 
PHP:
SELECT
    s.EP,
    s.level,
    l.EP AS nl_EP
FROM
    states AS s
INNER JOIN levels AS l ON
    l.EP > s.EP
WHERE
    s.ID = USER_ID
ORDER BY
    nl_EP ASC
LIMIT 1

So sollte es (auch) gehen. Kannst ja mal Performance-Test durchführen^^
 
aber solange es funktioniert ist ja alles gut :ugly:

Sag das nicht zu laut, sonst kommen die Cracks und hauen dir auf die Finger :p
Meiner Meinung nach könnte es sogar sein, dass die Zwei-Query-Version besser skaliert auf Dauer. Kommt natürlich auch immer auf die Größe des Projekts an.

Greetz

paddya
 
Sag das nicht zu laut, sonst kommen die Cracks und hauen dir auf die Finger :p
Meiner Meinung nach könnte es sogar sein, dass die Zwei-Query-Version besser skaliert auf Dauer. Kommt natürlich auch immer auf die Größe des Projekts an.

Greetz

paddya

Nunja diese Abfrage wird eigentlich bei jedem Seitenaufruf neu ausgeführt daher möchte ich eigentlich auf weitere Querys verzichten, da ich ab und zu noch 3 weitere brauche. Aber psst ^^' Die werde ich nun auch (hoffentlich) alleine los :mrgreen: