Mysql Abfrage aus 3 Tabellen vereinfachen
Ich suche nach einer Resourcenschonenden Version der folgenden Abfrage...
Hallo,
ich habe folgende unten stehende Abfage, die zwar in einer kleinen Datenbank ganz gut klappt, in einer DB mit mehreren Tausend Einträgen aber nicht wirklich effektiv erscheint.
Hinter der Query steht folgender Sinn:
Ich möchte jeden Interessenten aus der Tabelle i, der in der Tabelle Kontakte eingetragen ist, wobei der Kontakt in der Tabelle i zum Projekt aus Tabelle p gehören muss, dessen firmen_id (in der Tabelle p) gleich dem Wert meiner $_SESSION['firmen_id'] (wird beim Login vergeben) ist,
ODER ABER der interessent wurde von einem User mit der gleichen $_SESSION['firmen_id'] (quasi von einem Mitarbeiter der gleichen Firma) angelegt wie meine $_SESSION[firmen_id].
Gibt es da eine bessere, vor allem resourcenschonende Formulierung der folgenden Abfrage:
Danke euch im Voraus,
Lg, Chris
Hallo,
ich habe folgende unten stehende Abfage, die zwar in einer kleinen Datenbank ganz gut klappt, in einer DB mit mehreren Tausend Einträgen aber nicht wirklich effektiv erscheint.
Hinter der Query steht folgender Sinn:
Ich möchte jeden Interessenten aus der Tabelle i, der in der Tabelle Kontakte eingetragen ist, wobei der Kontakt in der Tabelle i zum Projekt aus Tabelle p gehören muss, dessen firmen_id (in der Tabelle p) gleich dem Wert meiner $_SESSION['firmen_id'] (wird beim Login vergeben) ist,
ODER ABER der interessent wurde von einem User mit der gleichen $_SESSION['firmen_id'] (quasi von einem Mitarbeiter der gleichen Firma) angelegt wie meine $_SESSION[firmen_id].
Gibt es da eine bessere, vor allem resourcenschonende Formulierung der folgenden Abfrage:
$inter_q_r = "SELECT DISTINCT(i.i_id), i.vorname, i.nachname, i.adresse, i.plz, i.ort, i.land, DATE_FORMAT(i.i_erstellt, '%e.%c.%Y') as datum
FROM ".TABLE_INTERESSENTEN." i, ".TABLE_KONTAKTE." k, ".TABLE_PROJEKTE." p
WHERE (i.i_system_status = '1'
AND i.i_id = k.interessenten_id
AND k.projekt_id = p.p_id
AND p.p_firmen_id = '".(int)$_SESSION['firmen_id']."')
OR (i.firmen_id = '".(int)$_SESSION['firmen_id']."')
ORDER BY i.nachname ASC, i.vorname ASC, i.plz ASC ";
Danke euch im Voraus,
Lg, Chris
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 165861
Url: https://administrator.de/forum/mysql-abfrage-aus-3-tabellen-vereinfachen-165861.html
Ausgedruckt am: 26.12.2024 um 22:12 Uhr
5 Kommentare
Neuester Kommentar
Moin ChrisFah,
da du ja ausschlieslich Felder aus der INTERESSENTEN-Tabelle brauchst, würde ich es so versuchen:
ungetestet
Ich habe die Logik insofern umgedreht, dass auf jeden Fall [nur] die Sätze aus i angezeigt werden, die i.system_status=1 haben
UND entweder (i.firmen_id = FirmenId laut SESSION) haben
ODER aber in dem Kontakt/Projekt-Gelumpe mit einer FirmenId laut SESSION erscheinen.
Da die beiden eintweder/oder-Teile disjunct sind habe ich auch das DISTINCT weggelassen.
Grüße
Biber
da du ja ausschlieslich Felder aus der INTERESSENTEN-Tabelle brauchst, würde ich es so versuchen:
$inter_q_r = "SELECT i.i_id, i.vorname, i.nachname, i.adresse, i.plz, i.ort,
i.land, DATE_FORMAT(i.i_erstellt, '%e.%c.%Y') as datum
FROM ".TABLE_INTERESSENTEN." i
WHERE (i.i_system_status = '1' )
AND (
(i.firmen_id = '".(int)$_SESSION['firmen_id']."')
OR EXIST ( SELECT * FROM ".TABLE_KONTAKTE." k, ".TABLE_PROJEKTE." p
WHERE
AND i.i_id = k.interessenten_id
AND k.projekt_id = p.p_id
AND p.p_firmen_id = '".(int)$_SESSION['firmen_id']."')
)
ORDER BY i.nachname ASC, i.vorname ASC, i.plz ASC ";
Ich habe die Logik insofern umgedreht, dass auf jeden Fall [nur] die Sätze aus i angezeigt werden, die i.system_status=1 haben
UND entweder (i.firmen_id = FirmenId laut SESSION) haben
ODER aber in dem Kontakt/Projekt-Gelumpe mit einer FirmenId laut SESSION erscheinen.
Da die beiden eintweder/oder-Teile disjunct sind habe ich auch das DISTINCT weggelassen.
Grüße
Biber
Moin ChrisFan,
unabhängig davon, ob einer meiner Tipps hilft oder nicht: Nenn mich bitte nicht "Bieber".
Auch wenn ich mal total daneben liege.
Der "Bieber" bedient andere Zielgruppen.
Und du kannst uns u.a. dadurch unterscheiden, das ich nur je 5 Buchstaben im Vor- und Nachnamen habe, der Weichgespülte aber jeweils 6.
Es gibt auch noch zwei, drei weitere Unterschiede.
Grüße
Biber
unabhängig davon, ob einer meiner Tipps hilft oder nicht: Nenn mich bitte nicht "Bieber".
Auch wenn ich mal total daneben liege.
Der "Bieber" bedient andere Zielgruppen.
Und du kannst uns u.a. dadurch unterscheiden, das ich nur je 5 Buchstaben im Vor- und Nachnamen habe, der Weichgespülte aber jeweils 6.
Es gibt auch noch zwei, drei weitere Unterschiede.
Grüße
Biber
[OT[ @ChrisFah,
obwohl... andere haben weniger Berührungsängste mit Retorten-Weichspülern wie Justin oder Silan..
"Silan" ist zum Beispiel auch ein in Deutschland neuerdings modischer männlicher Vorname...*gg
Im kurdischen wie auch im kroatischen bedeutet "Silan" eigentlich "der Starke" - diese Jungs haben's bestimmt nicht leicht in Österreich.
Grüße
Biber
[/OT]
obwohl... andere haben weniger Berührungsängste mit Retorten-Weichspülern wie Justin oder Silan..
"Silan" ist zum Beispiel auch ein in Deutschland neuerdings modischer männlicher Vorname...*gg
Im kurdischen wie auch im kroatischen bedeutet "Silan" eigentlich "der Starke" - diese Jungs haben's bestimmt nicht leicht in Österreich.
Grüße
Biber
[/OT]