Query über 5 Tabellen, ich brauch Hilfestellung.

Diskutiere mit über: Query über 5 Tabellen, ich brauch Hilfestellung. im Datenbanksysteme für das Web Forum

  1. koli.bri

    koli.bri Thread Starter Gast

    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
     
  2. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.029
    Zustimmungen:
    1.314
    Registriert seit:
    13.09.2004
    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!
     
  3. koli.bri

    koli.bri Thread Starter Gast

    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
     
  4. Sebo@mac

    Sebo@mac MacUser Mitglied

    Beiträge:
    267
    Medien:
    1
    Zustimmungen:
    3
    Registriert seit:
    24.08.2006
    gibts nicht ein tool wie visdio für mac, mit dem du eben ein bildchen zaubern könntest?
    würde mir zumindest sehr helfen...
     
  5. /aquila

    /aquila MacUser Mitglied

    Beiträge:
    216
    Zustimmungen:
    14
    Registriert seit:
    29.03.2006
    habe auch schon versucht da durch zusteigen, ist aber nicht wirklich leicht
     
  6. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.029
    Zustimmungen:
    1.314
    Registriert seit:
    13.09.2004
    die Lösung steht doch schon da:

    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?
     
  7. koli.bri

    koli.bri Thread Starter Gast

    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
     
  8. koli.bri

    koli.bri Thread Starter Gast

    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)
     
Die Seite wird geladen...
Ähnliche Themen - Query über Tabellen Forum Datum
komplizierter MySQL Query Datenbanksysteme für das Web 18.08.2008
Abfrage über zwei Tabellen, eindeutige Zuweisung mit ID nicht möglich Datenbanksysteme für das Web 26.04.2008
MySQL-Query gesucht Datenbanksysteme für das Web 24.07.2007
Forum über SQL Datenbanksysteme für das Web 28.03.2007
CONCAT über mehrere Zeilen Datenbanksysteme für das Web 05.03.2006

Diese Seite empfehlen

Benutzerdefinierte Suche