Query über 5 Tabellen, ich brauch Hilfestellung.

K

koli.bri

Hallo ihr gottähnlichen Programmierer :)

Ich hab für mein RPG-System eine Funktion, die nicht so will, wie ich.
Um nicht alles doppelt und dreifach zu schreiben, möge man mir Nachsehen, dass ich als Problembeschreibung nur einen Link zu meinem Entwicklungsblog angebe.
Dort ist alles wichtige beschrieben.
Auf Quellode habe ich bewusst verzichtet, um eventuelle Helfer nicht mit meinem Gewusel vielleicht auf die Falsche Fährte zu locken, denn ich glaube, dass ich bereits im Ansatz einen Fehler habe, der mir nicht klar wird.

http://somunia.blogspot.com/2007/01/problemchen.html

Vorweg:
Ich frage nicht nach fertigen Code!
Sollte dennoch wer mir in windeseile ein fertiges Query zaubern, weil ich einfach nur auf meinen Augen gesessen habe, und den Code vor llauter Zeichen nicht gesehen habe, so werde ich mich aber auch nciht beschweren. ;)

Es geht mir nur um eine Hilfestellung, wie ich das Problem angehe, wie es es mache.

Und:
Verwirrt mich bitte nicht zu sehr mit Fachbegriffen, da ich mir das alles selber beigracht habe, kann es gut sein, dass ich den einen oder anderen Fachbegriff einfach nicht kenne :)

In diesem Sinne, stürzt euch auch das Problemchen und rühmt euch danach mit der Tatsache, dass ihr bei einem zukünftigen Open-Sorce-Projekt mitgewirkt habt :D

mfg
Lukas
 

wegus

Aktives Mitglied
Mitglied seit
13.09.2004
Beiträge
17.184
bist Du so nett und kopierst das Problem hier hinein? Irgendwann ist das Problemchen nicht mehr online ( oder das ganze Blogchen) und dann nutzt dieser thread Niemandem mehr!
 
K

koli.bri

Wegus, daran hatte ich gar nicht gedacht. Wo ich doch immer predige, man sollte das Forum nicht nur als Anlaufstelle sondern auch Wissensdatenbank verstehen... Mea Culpa, Mea Maxima Culpa.

Also, der einfachheit Halber Eine C&P-Variante des Blogeintrags:

"Da dachte ich, ich hätte das Ausrüstungsmenü fertig, und dann kommt die ernüchternden Schläge.
In meiner Unbedachtheit hatte ich die Anzeige der Gegenstände nicht vom Spielstand abhängig gemacht.
Und, was noch viel schlimmer ist:
Hatte man ein Schwert im Inventra, so konnte dieses eine Schwert jeder einzelne Charakter gleichzeitig tragen. Freillich, nicht sehr realistisch, und nicht gerade von Vorteil, stelle man sich drei Kämpfer, zusammen ein Schwert tragend vor einem Gegner vor. Belustigend, aber nicht das, was eigentlich gedacht war.

Machen wir uns an die Problemlösung.

Der Query zur Anzeige der verfügbaren Waffen läuft über folgende Tabellen:

zubehoer
-> Hier sind alle Informationen zu dem Ausrüstungsgegenstand enthalten.
-> Jeder Satz ist mit einer Eindeutigen ID versehen

zubehoerarten
-> Jede Ausrüstung ist einer Gruppe zugeordnet.
-> Jede Art ist ebenfalls einer eindeutigen ID zugeordnet.

charakter_zubehoer
-> Hier werden die Charaktere über die Charakter-ID der Zubehoerart zugeordnet.
-> Auch hier hat jeder Datensatz eine eigene ID

spielstand_charaktere
-> Anhand des Spielstandes wird hier die Ausrüstung des Charakters gespeichert
-> Wie immer, auch mit einer eindeutigen ID

spielstand_ausrüstung
-> Das ist die Inventarliste mit allen Ausrüstungen (Bzw, in der Realität sind es drei Tabellen, eine für Waffen, eine für Rüstungen und eine für Zubehör, aber da alle drei gleich aufgebaut sind, kann man sich auf eine Beschränken)
-> Ist gekoppelt an den Spielstand
-> Es wird jede Waffe einzeln gespeichert, das heißt, hat man ein Schwert zweimal, taucht es auch zweimal in der Tabelle auf. Ein Feld "Anzahl" gibt es nicht.
-> Ebensowenig gibt es kein Feld "ist ausgerüstet", was auch nicht hinzu soll (da ich keine Werte in Tabellen speicher, die berechnet werden können)


Die Variablen zur Spielstand-ID und der Charakter-ID sind bekannt.

Und gewünscht ist ein Query, was mir eine Liste der verfügbaren Ausrüstunggegenstände gibt.

Verfügbar sind:
Alle Ausrüstungsgegenstände, die in der Tabelle spielstand_ausrüstung aufgelistet sind, aber NICHT bereits durch einen anderen Charakter benutzt wird.

Und da ich hier am Ende mit meinem Latein bin, frage ich euch um Hilfe :)
"

Aber da Wegus meine Unzulänglichkeiten schon verniedlicht, gehe ich mal davon aus, dass es für euch großen da draußen nichts schwieriges ist, und ich eventuell doch noch heute Abend da vor sitze und mir denke "Ach Luka,s du bist so blöd, das ganze ist doch voll einfach".

Demnach, vielen Dank, wegus, für diesen Schubser :)

gruß
Lukas
 

Sebo@mac

Mitglied
Mitglied seit
24.08.2006
Beiträge
292
gibts nicht ein tool wie visdio für mac, mit dem du eben ein bildchen zaubern könntest?
würde mir zumindest sehr helfen...
 

/aquila

Mitglied
Mitglied seit
29.03.2006
Beiträge
219
habe auch schon versucht da durch zusteigen, ist aber nicht wirklich leicht
 

wegus

Aktives Mitglied
Mitglied seit
13.09.2004
Beiträge
17.184
die Lösung steht doch schon da:

Verfügbar sind:
Alle Ausrüstungsgegenstände, die in der Tabelle spielstand_ausrüstung aufgelistet sind, aber NICHT bereits durch einen anderen Charakter benutzt wird.
Code:
select ausrüstungs_id, ausrüstungs_name,... from spielstand_ausrüstung where ausrüstungs_id not in (select ausrüstungs_id from charakter_zubehoer)
Will sagen gib mir jede Ausüstungs-ID, die sich nicht in der Tabelle der charakter-Inventarlisten befindet. Was braucht man da mehr als die Visualisierung zwischen den Ohren?
 
K

koli.bri

Es gibt ein tool für den Mac, mit dem man sowas darstellen kann.
Concept Draw, das war mal in einer Mac-Zeitschrift als Vollversion drin (allerdings nicht die neuere Version).

Mein Problem der Darstellung war, dass ich zur Zeit dieses Beitrags nicht an meinem Mac saß, sondern auf der Arbeit.

Ich hoffe, ihr Seid mir nicht böse, aber ich hab das Problem bereits gelöst, bzw. einen Lösungsansatz gefunden und umgesetz. Den gilt es jetzt nur noch zu verbessern.

Dazu möchte ich euch aber den Quellcode geben, was ich aber dann entweder heute Abend oder morgen Früh mache :)

vielen Dank bisher
gruß
Lukas
 
K

koli.bri

Ok, hier die versprochenen Funktionen. Zwar etwas später, weil gestern das WLAN nicht ging, aber egal.

PHP:
<?
function sqlmenueausrwaffelist($spielid,$userid,$charid){
	$ret = array();
	$spielstand = sqlgetspielstand($spielid,$userid);
	
*/	
	$qry = "
		SELECT
			z.waffen_ID,
			z.waffen_name,
			z.waffen_beschreibung,
			z.waffen_maxhp,
			z.waffen_maxmp,
			z.waffen_staerke,
			z.waffen_mana,
			z.waffen_verteidigung,
			z.waffen_reaktion,
			z.waffen_zabwehr,
			z.waffen_glueck,
			z.waffen_initiative,
			za.waffenarten_name,
			sz.spielstand_waffen_anzahl
		FROM
			waffen z,
			waffenarten za,
			charakter_waffenarten cza,
			spielstand_waffen sz
		WHERE
			sz.spielstand_waffen_spielstandID = ".$spielstand."
		AND
			sz.spielstand_waffen_waffenID = waffen_ID
		AND
			z.waffen_art = za.waffenarten_ID
		AND 
			cza.charakter_waffenarten_charakterID = ".$charid."
		AND
			cza.charakter_waffenarten_waffenartenID = waffenarten_ID
	";
	$sql = mysql_query($qry) OR die("sqlmenueausrwaffenlistq1: ".mysql_error());
	while($tmp = mysql_fetch_array($sql,MYSQL_ASSOC)){
//	print_r($tmp);
		$qry2 = "
			SELECT
				count(spielstand_charaktere_charakter_waffe) AS count
			FROM
				spielstand_charaktere
			WHERE
				spielstand_charaktere_spielstand_ID = ".$spielstand."
			AND
				spielstand_charaktere_charakter_waffe = ".$tmp['waffen_ID']."
		";
		$sql2 = mysql_query($qry2) or die("sqlmenueausrwaffenlistq2: ".mysql_error());
		$tmp2 = mysql_fetch_array($sql2,MYSQL_ASSOC);
//		print_r($tmp2);
		if($tmp2['count'] < $tmp['spielstand_waffen_anzahl']){
			$tmp['anzahl'] = $tmp['spielstand_waffen_anzahl'] - $tmp2['count'];
			$ret[] = $tmp;	
		}
	}
	return $ret;
}
function tplmenueausrwaffelist($spielid,$userid,$charid){
	$var = "";
	$waffenlist = sqlmenueausrwaffelist($spielid,$userid,$charid);
	$var .= "<span style=\"border:red solid 1px; \">";
	$rv = array(
		"spielid" => $spielid,
		"userid" => $userid,
		"charid" => $charid,
		"waffeid" => 0
	);
	$var .= requestlink("menueausrwaffe",$rv)."Ablegen</a>";
	$var .= "</span><br>";
	
	foreach($waffenlist AS $waffen){
		$var .= "<span style=\"border:red solid 1px; \">";
		$rv = array(
			"spielid" => $spielid,
			"userid" => $userid,
			"charid" => $charid,
			"waffeid" => $waffen['waffen_ID']
		);
		$var .= requestlink("menueausrwaffe",$rv).$waffen['waffen_name']."</a> (".$waffen['anzahl'].")";
		$var .= "</span><br>";
	}
	return $var;

}

?>
Wie man sieht, sind das immer noch zwei Querys. Krieg ich die da raus?
Was muss ich mir angucken, damit ich das auch von alleine schaffe + lerne?

lieben Gruß
Lukas

PS.: Am Gegensatz zu der ersten aufgabenstellung habe ich jetzt doch ein Feld "Anzahl" in "spielstand_waffen". Ansonsten hätte ich das über eine COUNT()-Funktion machen müssen.
Daher gilt:
Verfügbar heißt:
Die Anzahl der entsprechenden Waffen (tabelle "spielstand_waffen" )
(die dem entsprechendem Spielstand zugeordnet sind)
ist größer als die Anzahl ausgerüsteter Waffen (tabelle "spielstand_charaktere" )
(die dem entsprechendem Spielstand zugeordnet sind)
 
Oben