LEFT OUTER JOIN (Performance)?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • LEFT OUTER JOIN (Performance)?

    Was ist performanter/sauberer?
    Code:
    SELECT r.groupid hyperfluid, g.groupid
    FROM rights r
    LEFT OUTER JOIN groups g
    USING (GROUPID)
    HAVING g.groupid IS NULL
    oder
    Code:
    SELECT r.groupid hyperfluid, g.groupid
    FROM rights r
    LEFT OUTER JOIN groups g
    USING (GROUPID)
    WHERE g.groupid IS NULL
    Oder wie würdet ihr prüfen, ob die referentielle Integrität verletzt wurde, damit die Datensätze dann gelöscht werden können?

    Zur Erklärung: Die Tabelle "rights" beinhaltet versch. Rechte, die zu einer Gruppe gehören. Wird nun eine Grupe entfernt, müssen ja auch die Rechte, die zu dieser Gruppe gehören entfernt werden
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    Was ist performanter/sauberer?
    Ich würde grundsätzlich sagen , die Abfrage mit WHERE ist immer perfomanter, da HAVING, ja nix anderes ist als eine 2. WHERE abfrage auf bereits selektierte datensätze.

    gruss

    rth
    H I L F E
    GD FreeType Antialising
    Gesuch PHP Entwicklungsumgebung
    ------------------------------------------
    Der Cmabrigde rael tset, sruf whoin du wlilst

    Kommentar


    • #3
      Im Prinzip sind beide Abfragen gleich schnell. denn MySQL ersetzt HAVING, wenn es keine GROUP Klausel gibt automatisch durch WHERE. Also kannst du eigentlich gleich die 2te Query nehmen.

      @mrhappiness: Warum ist das überhaupt nötig? Wenn deine Scripte ordentlich sind, müsste das Prüfen der referentiellen Integrität doch gar nicht nötig sein.
      Wenn du eine Gruppe löschst, machst du das halt gleich so:
      Code:
      DELETE FROM groups WHERE groupid=X;
      DELETE FROM rights WHERE groupid=X;
      [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
      [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
      [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

      © Harald Schmidt

      Kommentar


      • #4
        Original geschrieben von Troublegum
        Im Prinzip sind beide Abfragen gleich schnell. denn MySQL ersetzt HAVING, wenn es keine GROUP Klausel gibt automatisch durch WHERE. Also kannst du eigentlich gleich die 2te Query nehmen.
        alla gut

        Warum ist das überhaupt nötig? Wenn deine Scripte ordentlich sind, müsste das Prüfen der referentiellen Integrität doch gar nicht nötig sein.
        Wenn du eine Gruppe löschst, machst du das halt gleich so:
        Code:
        DELETE FROM groups WHERE groupid=X;
        DELETE FROM rights WHERE groupid=X;
        ja, und wenn ich die rechte gelöscht hab, muss ich das gleiche noch in meiner zuordnungstabelle mache
        Code:
        rightid | userid
        und wie mach ich das dann da?

        da müsste ich ja schon irgendwo vorher auslesen, was ich für rechte fälschlicherweise drin stehen hab und ergo hab ich mir ne funktin geschrieben, die beim löschen von gruppen, die rechtetabelle und die zuordnungstabelle ggf. berichtigt und beim löschen von rechten eben nur die zuordnungstabelle
        Zuletzt geändert von mrhappiness; 15.06.2003, 10:43.
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          wenn man mit mehreren tabellen arbeitet gibt es nur diese beiden möglichkeiten.

          1.
          man löscht was aus einer der beiden daten-tabellen. in diesem fall SOLLTE man natürlcih auch aus der verknüpfungstabelle den eintrag entfernen.

          2.
          wenn man einen zuordnung (verknüpfung) löscht, ist nur diese tabelle betroffen.

          so würde ich das machen, bzw. mache das auch so. somit kann auch keinerlei referenz verletzt werden.
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            genau das war ja meine frage.

            wenn ich entweder ein recht entferne oder nen user rausschmeisse, brauch ich die einträge in der zuordnungstabelle ja nich mehr, daher such ich mir so die einträge raus, die fehlerhaft, da ohne eintrag in parent-tabelle sind

            geht das denn irgendwie performanter als so?
            PHP-Code:
            $sql='SELECT z.rightid hyperfluid, r.rightid
            FROM zuordnung z
            LEFT OUTER JOIN rights r
            USING (rightid)
            HAVING r.rightid IS NULL'
            ;
            $result=mysql_query($sql);
            if (
            mysql_num_rows($result)>0)
            {
              while(
            $recht=mysql_fetch_assoc($result))
                 
            $rechte[]=$recht['hyperfluid'];
              
            $sql='DELETE FROM rights WHERE rightid IN ('.implode(',',$rechte).')';
              
            mysql_query($$sql);

            nur mit sql krieg ich das nich hin oder?
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              wenn du die ids der verknüpfung kennst, kannst du zweimal ein DELETE machen.
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                hä?
                DELETE FROM rights WHERE rightid=5
                DELETE FROM zuordnung WHERE rightid=5

                so?

                schon klar, aber ich hab folgende situation:
                ich hab rechtegruppen, lösche ich jetzt eine gruppe, klappt das

                DELETE FROM groups WHERE groupid=4
                DELETE FROM rights WHERE groupid=5

                aber ich muss ja an die IDs der rechte kommen, die gelöscht wurden, damit ich die aus der zuordnungstabelle rausschmeissen kann

                irgendwo muss ich mir also per join die infos holen (sagt mir mein krankes hirn)
                entweder schau ich, welche rechte ich durch das löschen einer gruppe entfernen und nehm die dannaus der zurodnungstabelle raus, oder ich schaue, welche in der zuordnungstabelle fälschlicherweise drinstehen

                DELETE FROM zuordnung WHERE rightid IN(SELECT ...) geht ja leider gottes nich, also wird ne reine sql-variante wahrscheinlich ausscheiden oder?

                daher die frage: geht's irgendwie besser als so wie ich das jetzt mache?
                OffTopic:
                ich weiß, das is jetzt wahrscheinlich eher ne php-frage oder gibt's doch ne lösungmit sql? )
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  wenn du eine recht aus der rechte.tab komplett löschen willst, so muss es ja bei allen usern entfernt werden.

                  dein ansatz oben war genau richig.
                  Code:
                  DELETE FROM rechte WHERE rechteid=5
                  DELETE FROM user_rechte WHERE rechteid=5
                  wenn du nur bei einem user ein recht löscht kennst du userid und rechteid. also
                  Code:
                  DELETE FROM user_rechte WHERE userid=1 AND rechteid=5
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    wenn ich ein recht löschen will, dann kenn ich die id, das ist wohl wahr,

                    aber wenn ich eine gruppe lösche, weiß ich nicht welche recht (mitsamt ids) sich dahinter verbergen
                    Code:
                    Tabelle Gruppe
                    groupid | groupname
                    1         Gruppe 1
                    2         Gruppe 2
                    3         Gruppe 3
                    
                    Tabelle Rechte
                    rightid | groupid | rightname
                    1         1         Recht 1 Gruppe 1
                    2         1         Recht 2 Gruppe 1
                    3         1         Recht 3 Gruppe 1
                    4         2         Recht 1 Gruppe 2
                    5         2         Recht 2 Gruppe 2
                    6         2         Recht 3 Gruppe 2
                    7         3         Recht 1 Gruppe 3
                    8         3         Recht 2 Gruppe 3
                    9         3         Recht 3 Gruppe 3
                    10        4         Recht 1 Gruppe 4
                    
                    Tabelle Zuordnung
                    rightid | userid
                    1         1
                    9         4
                    1         5
                    7         16
                    8         6
                    1         4
                    1         2
                    wenn ich jetzt
                    DELETE FROM gruppe WHERE groupid=3
                    mache, kann ich ja problemlos
                    DELETE FROM rechte WHERE groupid=3
                    machen, aber in meiner zuordnungstabelle hab ich ja noch rechte stehen, die zu jetzt nicht mehr vorhandenen gruppe 3 gehört hatten


                    und ic wüsstenich, wie ich die anders rauslöschen sollte, als mit dem php-code den ich gepostet hab
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      aso. verstehe. ich bin davon ausgegegangen, dass deine rechte.tab auch den namen beinhaltet. was hier ja deine gruppen.tab ist. deine rechte verbinden sich ja nur mit der gruppe.

                      das prinzip ist doch aber dennoch das gleiche. wenn du nur ne id eines rechtes hast, kannst du die auch aus der gruppe löschen. da die gruppen zugeordnet sind beim user musst du in der tat erst einmal die gruppenid finden. mit php/mysql. anders geht es nicht.

                      tipp:
                      mache noch eine tab für verküpfungen.

                      rechte (einzelnes recht)
                      gruppe (rechte gruppieren)
                      user_gruppe (grupe dem user zuweisen)
                      user_rechte (einzelnes recht dem user zuweisen)

                      letzteres ist sinnvoll wenn du nur ein recht aus einer gruppe vergeben willst. z.b. nur lesen.
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar


                      • #12
                        aber dann muss ich doch in ein paar mehr tabellen nachschauen, um zu wissen, ob der user eine bestimmte aktion durchführen darf oder?
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          na und... ;-)

                          du hast ja dann eh eine fkt namen checkright(id=44) z.b.

                          für diese fkt ist ja nur die id des rechts interessant. die userid ist dir bekannt.

                          also machst du erst einmal eine prüfung in den rechten direkt oder erst in den gruppen (jenachdem was häufiger kommt) ist da nix drin, entsprechend das andere.
                          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                          Kommentar


                          • #14
                            hab bisher so gemacht:
                            PHP-Code:
                            function grant_right($userid$rights,$type=RM_RIGHTS)
                            {
                              if (
                            $type==RM_RIGHTS)
                                 
                            //das eine recht gewähren
                              
                            else
                                
                            //alle Rechte zu der Gruppe auslesen und die dann gewähren

                            so hab ich alles in einer tabelle stehen, umgekehret natürlich auch
                            PHP-Code:
                            function remove_right($userid$rights,$type=RM_RIGHTS
                            is das unpraktischer?
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              wofür ist RM_RIGHTS ?

                              was die beste lösung ist, denke ich, wird die praxis zeigen. aber die von mir vorgeschlagene lösung hatte ich mir mal überlegt aber bisher nie umgesetzt.

                              und weil du das teil so schön machst, helfe dich dir und warte ab.
                              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                              Kommentar

                              Lädt...
                              X