kostenloser Webspace werbefrei: lima-city


where vor join

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    unlikus

    unlikus hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. Autor dieses Themas

    unlikus

    unlikus hat kostenlosen Webspace.

    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.
  5. 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
  6. Autor dieses Themas

    unlikus

    unlikus hat kostenlosen Webspace.

    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
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!