Moin,
ich möchte meine Datenbank-Abfrage mal etwas vereinfachen bzw. für die Abfrage auch wirklich nur noch einen Query losschicken und nicht mehr 3. Das sollte ja auch im Interesse der Performance liegen. Ich habe soweit alle Tabellen so sehr vereinfach wie nur möglich:
Funktionsweise: Ich gebe einen String ein (im Folgenden $EINGABE$ genannt), der in allen 3 Tabellen gesucht wird und als erhalte ich die Liste von ids aus table3.
Aktuell sieht das grob so aus:
Abfrage für table1:
$ERGEBNIS1$ enthält alle ids aus table1 die passen.
Dann bau ich mir einen String zusammen, der in der letzten Abfrage benutzt wird:
Abfrage für table2:
$ERGEBNIS2$ enthält alle ids aus table2 die passen.
Dann bau ich mir einen String zusammen, der in der letzten Abfrage benutzt wird:
Zum Schluss wird mein Query auf table3 ausgeführt und die Strings $WHERE1$ und $WHERE2$ eingebaut:
Beispiel: $EINGABE$ = 'aa', dann ist:
$ERGEBNIS1$ = [1,3]
-> $WHERE1$ = "OR (table3.table1id = 1) OR (table3.table1id = 3)"
$ERGEBNIS2$ = [1]
-> $WHERE2$ = "OR (table3.table2id = 1)"
Die resultierende Anfrage sieht dann so aus:
Als Ergebnis erhalte ich dann: [1,3]
Also im Endeffekt würde ich die ersten 2 Querys gern direkt mit in die letzte DB-Anfrage einpflanzen. Die Frage ist gerade nur: WIE?
ich möchte meine Datenbank-Abfrage mal etwas vereinfachen bzw. für die Abfrage auch wirklich nur noch einen Query losschicken und nicht mehr 3. Das sollte ja auch im Interesse der Performance liegen. Ich habe soweit alle Tabellen so sehr vereinfach wie nur möglich:
Code:
table1: table2: table3:
id | text id | text id | table1id | table2id | text
---------- ---------- --------------------------------
1 | abaac 1 | cabaa 1 | 1 | 3 | abbba
2 | bbaca 2 | bacba 2 | 2 | 2 | bcabc
3 | babaa 3 | abcba 3 | 3 | 1 | abaab
Funktionsweise: Ich gebe einen String ein (im Folgenden $EINGABE$ genannt), der in allen 3 Tabellen gesucht wird und als erhalte ich die Liste von ids aus table3.
Aktuell sieht das grob so aus:
Abfrage für table1:
Code:
SELECT id FROM table1 WHERE text LIKE '%$EINGABE$%'
Dann bau ich mir einen String zusammen, der in der letzten Abfrage benutzt wird:
Code:
for ($ERGEBNIS$ in $ERGEBNIS1$) {
$WHERE1$ += 'OR (table3.table1id = $ERGEBNIS$)';
}
Abfrage für table2:
Code:
SELECT id FROM TABLE2 WHERE text LIKE '%$EINGABE$%'
Dann bau ich mir einen String zusammen, der in der letzten Abfrage benutzt wird:
Code:
for ($ERGEBNIS$ in $ERGEBNIS2$) {
$WHERE2$ += 'OR (table3.table2id = $ERGEBNIS$)';
}
Zum Schluss wird mein Query auf table3 ausgeführt und die Strings $WHERE1$ und $WHERE2$ eingebaut:
Code:
SELECT id FROM table3
JOIN table1 ON table1.id = table3.table1id
JOIN table2 ON table2.id = table3.table2id
WHERE text LIKE '%$EINGABE$%'
$WHERE1$
$WHERE2$
Beispiel: $EINGABE$ = 'aa', dann ist:
$ERGEBNIS1$ = [1,3]
-> $WHERE1$ = "OR (table3.table1id = 1) OR (table3.table1id = 3)"
$ERGEBNIS2$ = [1]
-> $WHERE2$ = "OR (table3.table2id = 1)"
Die resultierende Anfrage sieht dann so aus:
Code:
SELECT id FROM table3
JOIN table1 ON table1.id = table3.table1id
JOIN table2 ON table2.id = table3.table2id
WHERE text LIKE '%aa%'
OR (table3.table1id = 1)
OR (table3.table1id = 3)
OR (table3.table2id = 1)
Als Ergebnis erhalte ich dann: [1,3]
Also im Endeffekt würde ich die ersten 2 Querys gern direkt mit in die letzte DB-Anfrage einpflanzen. Die Frage ist gerade nur: WIE?
Zuletzt bearbeitet: