Klaus Mock: {MYSQL} JOINS über mehrer Tabellen

Beitrag lesen

Hallo

SELECT s.SID, u.UID, sr.SID, sr.RID, ur.UID, ur.RID FROM Sites AS s, User AS u, SiteRoules AS sr, UserRoules AS ur WHERE u.UID = ur.UID AND s.SID = sr.SID AND ur.RID = sr.RID

[...]
mein problem ist nun die performance. das karthesische produkt dieser 4 tabellen könnte in den himmel wachsen (mein gott, denk ich blumig ;).

Soweit ich Dein Statement richtig interpretiere, _willst_ Du eine Unmenge von Daten sehen. Du willst  ja jede Kombination aus den angegebenenwerten sehen. Da kann dann schon was zusammenkommen.
Eigentlich ist es ein Kreuzprodukt von den angebenen Tabellen (naja nicht ganz wahrscheinlich)
Da helfen auch keine JOINS, weil Du willst ja alles sehen.

Wenn ich Dich richtig verstehe, was natürlich nicht der Fall sein kann, dann willst Du eigentlich alle Rollen wissen, welche aktuell gültig sind.
also:

Ich postuliere mal einige Variablen (PHP ist da gleich wie Perl, oder irre ich mich, naja egal, Du wirst es schon lesen können, alle Dinge mit einem '$' vorn sind die Variablen)

Dann könnte das Statement so aussehen:

(Ich mach mal aus 'Roules' 'Roles', weils besser aussieht ;-) )
SELECT r.RID
FROM Roles r, UserRoles ur, SiteRoles sr
WHERE r.RID = ur.RID
AND   r.RID = sr.RID
AND   ur.UID = $AktuelleUID
AND   sr.SID = $AktuelleSID

Nun zum Thema Performance:
Das ist jetzt natürlich datenbankabhängig, aber so krass wirds nicht sein, denk ich mir, wenn Du ein solches Statement absetzt, und die Indizes halbwegs sauber aufgebaut sind.

Noch ein Tip: verwendet nicht blind DISTINCT, um doppelte Datensätze zu vermeiden. Versuche zuerst ein passendes Statement zu formulieren, das auch ohne DISTINCT auskommt. Weil _das_ geht wirklich mächtig auf die Performance, ohne daß Du es sofort bemerkst. Das DISTINCT greift nämlich meist erst nach der DB-internen Abfrage, und das ist der Schaden schon passiert.

So, ich hoffe, ich bin nicht zu weit weg mit meiner Vermutung

Grüße
  Klaus