• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Knifflige Verknüpfungserstellung

Status
Für weitere Antworten geschlossen.

Puccini

Neues Mitglied
Hi!

Ich erstelle über ein dynamisches Formular Abfragen.
Diese Abfragen werden in einer php-Datei zusammengestellt und dann mittels mysql abgefragt und ausgewertet.
Klappt alles...
Nur jetzt hab ich das Problem das ich ja noch joins brauche.
dh:
Tabelle1 ist mit Tabelle2 über Tabelle1.Feld1=Tabelle2.Feld4
verbunden.
Soweit so gut.
Der User kann bei mir bei der erstellung der abfrage folgendes auswählen:
Tabelle,Feld in dieser Tabelle,Vergleichsoperator,Wert
Man kann so selbst entscheiden welche Felder einer Tabelle alles angezeigt werden sollen und welche werte diese beinhalten sollen.
Funktioniert wunderbar.
Doch wenn jetzt nicht nur 1 Tabelle ausgewählt wurde, kommt es ja zu komplikatinene, da so millionen von datensätzen erzeugt werden ohnen einen join.
also:
Wenn der User so seine Abfrage gestalltet:
Code:
Tabelle1    Tabelle1    Tabelle2
Feld1        Feld4        Feld1
=                        >
1                        5
(Feld 4 hat keinen wert, da es nur m it ausgegeben werden soll)
So gibt es also 2 Tabellen, und wenn in jeder 100 Datensätze stehen, werden somit 100*100 datensätze erzeugt!
Dies ist jedoch nicht erwünscht, da ich weis, das tabelle1 mit tabelle2 verknüpfbar ist!

Kurz und gut:
ich brauche irgend einen allgorithmus, mittels dem ich mir die joins gestallten kann.
Bisher habe ich gedacht ich maches so:
In einer Tabelle "verweise" steht
Tabelle von,Feld von,Tabelle nach,Feld nach
somit ist festgehalten welche tabellen sich wie verknüpfen lassen.

Also brauch ich nur noch einen PHP Code der mir dann folgendes erzeugen würde:
Select * From
tabelle1 inner join(tabelle2 inner join tabelle3 on tabelle2.feld2=tabelle3.feld5) on tabelle1.feld1=tabelle2.feld4

.....
schwer zu beschreiben was ich will XD
also jenachdem wieviele unterschiedliche tabellen in der erzeugten abfrage auftauchen müssen auch die joins verschachtelt werden........

ich hab schon an eine rekursive funktion gedacht, die mir dann aus der tabelle ausliest was ich brauche.
doch leider find ich keinen ansatz :<

kennt wer dazu eine lösung?? :<
 
mal ein kleiner denkanstoss.

nur weil du mit einer datenbank arbeitest, MUSS nicht alles in der datenbank abgelegt werden. ich halte das bisher mit sehr grossem erfolg so:
ich habe ein verzeichnis queries, in dem eine datei liegt, die ca den aufbau hat:
Code:
query_name TAB query_code
die lese ich aus und kann bequem eine abfrage per phpmyadmin testen, mir die sql abfrage anzeigen lassen und mit copy/past in die datei übertragen.

auf diese art kannst du:
  1. deine queries mit jedem editor warten/ändern und dir sogar eine online wartung basteln, in der du queries änders oder hinzufügst oder was auch immer.
  2. ein dropdown erzeugen, wo du queries mit namen auswählst und abfragen lässt
  3. belibige queries hinzufügen/löschen/warten wenn du dir einen online editor schreibst.
  4. du musst nie mehr am script-code selber rumfummeln um abfragen zu ändern, du veränderst nur die datei in der das query liegt.
 
habs gelöst, zwar etwas verschachtelt, aber es geht :D

das mit der datei hab ich auch erst so gedacht, aber da die seite von vielen leuten genutzt werden soll, die sich net so mit sql befehlen auskennen, habe ich ein formular über welches die sich ihre abfragen selber basteln können.
(ähnlich wie im access, in der Entwurfsansicht)

:D es klappt

Code:
function GetJoins($Tabellen)
{
    global $dbName,$dbPasswort,$dbServer,$dbUser;
    $tempVerweise=array();
    //Jeder Join benötigt eine öffnen und schliessen Klammer
    //Die Anzahl der offenen Klammern wird hiermit festgehalten
    $AnzKlammern=0;
    //die erste Tabelle wird normal angefügt,
    //alle weiteren werden erst auf einen Verweis hin überprüft und
    //ggf mit einem Join angehangen
    $tempQuery=$Tabellen[0];
    
    for($i=1;$i<sizeof($Tabellen);$i++)
    {
        //Abfrage ob es zur letzten Tabelle einen verweis zu dieser Tabelle gibt.
            $query="SELECT * FROM verweiseabfragen WHERE 
                `Tabelle_von` = '".$Tabellen[$i-1]."' AND 
                `Tabelle_nach` = '".$Tabellen[$i]."' LIMIT 1";
        $db = @mysql_connect($dbServer, $dbUser, $dbPasswort);
        if($db)
        {
            $dbSelect = mysql_select_db($dbName);
                $dbAbfrage = @mysql_query($query);    
                //Wenn ein Verweis vorhanden ist, wird ein Join erzeugt
                if($dbAbfrage and mysql_num_rows($dbAbfrage)>0)
                {
                    $index = 0;
                    while ( $row = mysql_fetch_row( $dbAbfrage ) )
                    {    
                        $AnzKlammern++;    
                        for($k=0;$k<5;$k++)
                            $tempVerweise[$AnzKlammern][$k]=$row[$k];
                            
                                        
                    }
                    $tempQuery=$tempQuery." INNER JOIN (".$Tabellen[$i];
                }else
                {
                    //Wenn vorher noch ein Join war, muss dieser erst beendet werden
                    if($AnzKlammern>0)
                    {
                        for($k=$AnzKlammern;$k>0;$k--)
                        {
                            //Verknüpfen der Tabellen über die Angegebene Felder
                            //Abschluss des offenen JOINS
                            $tempQuery = $tempQuery.") ON ".
                            $tempVerweise[$k][1].".".$tempVerweise[$k][2]."="
                            .$tempVerweise[$k][3].".".$tempVerweise[$k][4];
                        }
                        $tempQuery=$tempQuery.", ".$Tabellen[$i];                        
                        $AnzKlammern=0;
                    }else
                    {
                        $tempQuery=$tempQuery.", ".$Tabellen[$i];
                    }
                }
            mysql_close($db);    
        }else    
            echo "Verbindungsfehler bei Verweistabelle. ".mysql_error();
    }
    //Abschluss aller offenen Joins
    if($AnzKlammern>0)
    {
                        for($k=$AnzKlammern;$k>0;$k--)
                        {
                            //Verknüpfen der Tabellen über die Angegebene Felder
                            //Abschluss des offenen JOINS
                            $tempQuery = $tempQuery.") ON ".
                            $tempVerweise[$k][1].".".$tempVerweise[$k][2]."="
                            .$tempVerweise[$k][3].".".$tempVerweise[$k][4];
                        }
                        $AnzKlammern=0;        
    }

    return $tempQuery;
}
die tabelle "verweiseabfragen" is so aufgebaut:
ID Tabelle_von Feld_von Tabelle_nach Feld_nach

somit muss nur die Verweistabelle gepflegt werden.
Dies geht ebenfalls über ein Formular auf der seite.
Dort gibt es wieder ein paar Dropdowns, die alle zur verfügung stehenden Tabellen auflisten und passend dazu die jeweiligen Felder bereit halten.
Somit soll es jedem User möglich sein seine eigenen Abfragen einfach und schnell zu basteln.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben