Tabellen nur nutzen wenn auch wirklich benötigt

rollerueckwaerts

Erfahrenes Mitglied
Huhu,

habe eine relativ große Abfrage die in PHP durch nen paar If's zusammengesetzt wird.

funktioniert alles soweit tippi toppi außer das bei einer Abfrage nen timeout kommt:

Code:
SELECT DISTINCT ko.vorname, ko.nachname, ko.kontaktid, ko.titel, ko.typ, ko.tel, ko.fax, ko.email, ko.foto
FROM _cq_kontakt ko, _cq_institution inst, _cq_blaaaaaa instb, _cq_bla, _cq_blaaa indb WHERE bla bla bla bla";

In manchen Fällen benötige ich garnicht alle Tabellen die bei FROM stehen, nehme ich die raus klappts wunderbar.
Leider müssen die ja drinnen bleiben. Gibts ne Möglichkeit SQL zu sagen wirklich nur in den Tabellen zu suchen die in der WHERE Bedinung angesprochen werden? Weil irgendwie verringert sich die Geschwindigkeit enorm wenn mehr Tabellen in FROM stehen, obwohl diese für die Abfrage nicht benötigt werden.

Bisschen kompi zu erklären aber vielleicht verstehts ja jemand :D

Gruß,

Tobi
 
Also wann du welche Tabelle benötigst, sollte ja schon klar sein bevor die SQL-Anweisung ausgeführt wird. Dann bilde einfach die Anweisung so wie du sie brauchst.

Abgesehen davon macht die Anweisung wie sie oben steht doch gar keinen Sinn. Du gibst bei der Feldliste den Tabellennamen an und hast dann aber ganz andere Tabellen angegeben!?

Wie sieht den der komplette Code für die Abfrage aus?
 
hmmmm .... wie kann man das denn schlauer anstellen ?

Code:
mysql_query("SET SQL_BIG_SELECTS=1");
  
  $query = "
SELECT DISTINCT ko.vorname, ko.nachname, ko.kontaktid, ko.titel, ko.typ, ko.tel, ko.fax, ko.email, ko.foto
FROM _cq_kontakt ko, _cq_institution inst, _cq_institutionbez instb, _cq_indikationbez indb WHERE ko.kontaktid!=0";


if($bundesland!=0) {
	$query.= " AND instb.kontaktid = ko.kontaktid AND inst.bundesland = ".$bundesland." AND inst.institutionid = instb.institutionid" ;
}

if($institution!=0) {
	$query.= " AND instb.institutionid = ".$institution." AND instb.institutionid = ".$institution;

}

if($abteilung!=0) {
	$query.= " AND instb.abteilung = ".$abteilung;
}

if($kontakttyp!=0) {
	$query.= " AND ko.typ = ".$kontakttyp;
}

if($thema!=0) {
	$query.= " AND themenb.kontaktid = ko.kontaktid AND themenb.themenid = ".$thema;
}

if($indikation!=0) {
	$query.= " AND indb.indikationid = ".$indikation." AND indb.kontaktid = ko.kontaktid";
}

$query.= " ORDER BY ko.nachname ASC" ;

    $result = mysql_query($query);


Die Performance kann man bei der ganzen Geschichte völlig vergessen -.-
 
Hi

So wie du deine Where-Clause generisch zusammen setzt musst du in dem Fall auch die From-Clause generisch erzeugen.
Ansonsten enstehen nicht grad weniger Kreuzprodukte. Dass das langsam ist, versteht sich dann wohl von allein
 
Etwa so. Musst noch mal überprüfen ob die $query richtig zusammengestellt wird. Zudem hast du uns nicht alles angegeben.
Aber von hier aus solltest du wohl sehen können wie's gemeint ist....

PHP:
mysql_query("SET SQL_BIG_SELECTS=1");
  
  $select = "SELECT DISTINCT ko.vorname, ko.nachname, ko.kontaktid, ko.titel, ko.typ, ko.tel, ko.fax, ko.email, ko.foto ";

  $from = " FROM _cq_kontakt ko ";

  $where = " WHERE ko.kontaktid!=0 ";



if($bundesland!=0 or $institution!=0 or ($abteilung!=0) {
    $from.= " , _cq_institutionbez instb ";

    $where.= " AND instb.kontaktid = ko.kontaktid ";

if($abteilung!=0) {
    $where.= " AND instb.abteilung = ".$abteilung;
}

if($institution!=0) {
    $where.= " AND instb.institutionid = ".$institution." AND instb.institutionid = ".$institution; // warum hier 2x das gleiche?
}

if($bundesland!=0) {
    $from.= " , _cq_institution inst ";

    $where.= " AND instb.kontaktid = ko.kontaktid AND inst.bundesland = ".$bundesland." AND inst.institutionid = instb.institutionid ";
}


}


if($kontakttyp!=0) {
    $where.= " AND ko.typ = ".$kontakttyp;
}
 
if($thema!=0) {
    $from.= " , _cq_themenbez themenb "; // tabellenname mal angenommen, da du keinen angegeben hast….

    $where.= " AND themenb.kontaktid = ko.kontaktid AND themenb.themenid = ".$thema;
}
 
if($indikation!=0) {
    $from.= " , _cq_indikationbez indb ";

    $where.= " AND indb.indikationid = ".$indikation." AND indb.kontaktid = ko.kontaktid";
}
 
$order = " ORDER BY ko.nachname ASC" ;

$query = $select.$from.$where.$order;

$result = mysql_query($query);
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück