where vor join
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aufpassen
auslese
basis
code
datenbank
definieren
denkfehler
ende
ergebnis
folgender code
frage
laden
logik
machen
menge
praxis
problem
suchen
tabelle
url
-
Also ich versuche mich gerade an einer etwas komplexeren mysql abfrage.
Ich habe eine Tabelle locations, die im wesentlichen id, und root enthält.
id ist die id der location und root, ist die id einer Basis location, wenn eine vorhanden ist. Das ganze geht in der praxis auch nur auf einer Ebene, also es gibt nur Basis locations und einfach abhängige locations.
Nun noch eine Tabelle obejct, welche im wesentlich aus id und location besteht.
Ein object befindet sich immer in genau einer location.
Nun will ich wenn ich eine location habe alle objecte auslesen, die sich in dieser und in den untergeordneten locations finden.
Mein Versuch war folgender:
SELECT objects.id FROM locations WHERE locations.id=4 or locations.root=4 INNER JOIN objects ON objects.location=locations.id
Das geht natürlich nicht, da die Where clausel an das Ende muss, aber wenn ich erst den JOIN mache kommt es soweit ich das beurteile mit der Logik nicht mehr hin und man hätte auch jeden Fall während des ausführens eine viel zu große Tabelle.
Wie soll ich das besser machen?
Hatte da wohl einen Denkfehler, die Logik ist noch die selbe wenn man das WHERE einfach nach hinten stellt. Aber jetzt ist noch das Problem mit der Performance weil der JOIN ja extrem unpräzise ist.
Beitrag zuletzt geändert: 30.7.2014 16:03:49 von unlikus -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
hallo unlikus,
was meinst du mit "...weil der JOIN ja extrem unpräzise ist..." ?
vielleicht ist ein nested-query in deinem fall performanter, aber das musst du mal ausprobieren da es wohl von den größen der tabellen und verwendeten indizes abhängt...
SELECT id FROM objects WHERE location=4 OR location=(SELECT root FROM locations WHERE where id=4)
lg hechma -
unlikus schrieb:
also mit unpräzise meine ich, dass der join ja erst mal eine ganze Menge datensätze liefert.
Nämlich alle objecte in der Datenbank zusammen mit ihren locations. Erst dann kommt das Where.
Nope, das macht optimiert sich MySQL schon so hin, dass es nur die objects läd, die auch zu laden sind. Du musst nur aufpassen, dass du keinen cross-join erzeugst, sonst hast du ein Performanceproblem, dazu ist es wichtig auch das ON zu definieren.
Dein Code wäre also:SELECT objects.id FROM locations INNER JOIN objects ON locations.id = objects.location WHERE locations.id = 4 OR locations.root = 4
MySQL sucht sich nun alle locations, deren id, oder root = 4 ist. Anschließend läd es alle objects, deren location = der id von locations (in dem Fall halt 4) ist und fügt die Ergebnisse zusammen.
Mit freundlichen Grüßen -
nemoinho schrieb:
unlikus schrieb:
also mit unpräzise meine ich, dass der join ja erst mal eine ganze Menge datensätze liefert.
Nämlich alle objecte in der Datenbank zusammen mit ihren locations. Erst dann kommt das Where.
Nope, das macht optimiert sich MySQL schon so hin, dass es nur die objects läd, die auch zu laden sind. Du musst nur aufpassen, dass du keinen cross-join erzeugst, sonst hast du ein Performanceproblem, dazu ist es wichtig auch das ON zu definieren.
Dein Code wäre also:SELECT objects.id FROM locations INNER JOIN objects ON locations.id = objects.location WHERE locations.id = 4 OR locations.root = 4
MySQL sucht sich nun alle locations, deren id, oder root = 4 ist. Anschließend läd es alle objects, deren location = der id von locations (in dem Fall halt 4) ist und fügt die Ergebnisse zusammen.
Mit freundlichen Grüßen
ok dann hoffe ich mal, dass mysql das auch genauso macht und meine Frage wäre damit geklärt. Vielen Dank -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage