SQLAbfrage - komme nicht weiter

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

  • SQLAbfrage - komme nicht weiter

    Hi @all,

    ich hab mal wieder ein Problem, bzw. ich steh etwas auf dem Schlauch, da ich nicht dahinter komme wie ich die Abfrage aufbauen soll:

    Also ich habe 3 Tabellen

    cw_user
    - uid (Primary, auto_inc)
    - username

    cw_userrechte
    - id (Primary, auto_inc)
    - rid
    - rtext
    - linktext

    cw_userstatus
    - id (Primary, auto_inc)
    - uid
    - rid

    Die Rechteid von cw_userrechte ist die Rechteid von cw_userstatus und uid von cw_user ist die eindeutige ID zu jedem User. Diese ist ebenfalls uid von cw_userstatus. So kann ich eindeutig zuweisen wer jetzt welche Rechte hat.

    Nun: Ich möchte rtext und linktext von cw_userrechte rausholen aber nur die Werte die cw_userrechte.rid = cw_userstatus.rid und cw_userstatus.uid = $login['uid'] ($login['uid'] wird in einer anderen SQL Abfrage herausgeholt)...

    für manche sicher ganz einfach - aber ich stehe übel auf dem SChlauch und komme hier nicht weiter

    cya CrazyPip

  • #2
    Code:
    SELECT r.rid, r.rtext, r.linktext
    FROM cw_userrechte r
    INNER JOIN cw_userstatus u
    USING (uid)
    WHERE u.uid=$login['uid']
    schnellschuss

    btw: was ist der unterschied zwischen cw_userrechte.id und cw_userrechte.rid?
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      DAnke für deine Antwort...

      der Unterschied ist solange rechte nur dazukommen und nicht gelöscht werden keiner. Wenn ich nun aber ein Recht lösche, weil ich es nicht mehr brauche oder zu testzwecken (was auch immer) dann bekomm ich nachher keine Probleme mehr da ich nur rid zum Vergleich mit anderen Tabellen benütze...also die id wird immer um eins addiert - rid nicht...

      naja, danke nochmal

      cya CrazyPip

      Kommentar


      • #4
        danke nochmal für deine Antwort - hat mir sehr geholfen. So heist die Abfrage nun richtig

        Code:
        	SELECT 		r.rtext as rtext, r.linktext as linktext 
        	FROM 		cw_userrechte r 
        	LEFT JOIN 	cw_userstatus u 
        	ON 		u.rid = r.rid 
        	WHERE 		u.uid=".$login['uid']
        danke

        cya CrazyPip

        Kommentar


        • #5
          und?
          wenn du ein recht löscht, is auch rid weg oder?
          EDIT:
          probier mal nen INNER JOIN und vergleiche die ausgaben in phpmyadmin
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            hi

            natürlich ist die rid dann auch weg, aber die kann ich ja einfach ohne weiteres erstetzen (mit dem Wert den ich brauche/möchte)...die id nicht da die automatisch gesetzt wird (id++)
            -> worauf willst du hinaus?

            bei LEFT und INNER gibt der mir immer die gleichen Werte aus - kein UNterschied (benütze kein PHPmyADMIN)
            -> warum?

            cya CrazyPip

            Kommentar


            • #7
              LEFT OUTER JOIN würde dir auch rechte liefern, die noch kein user hat, was du aber durch das where wieder rausnimmst, nimm ein INNER, is auf keinen fall schlechter

              ich will auf folgendes raus: rid identifiziert dein recht oder?
              id aber auch, und id is der primärschlüssel, also reicht dir auch eine der beiden spalten
              Code:
              id | rid
               1 | 1
               2 | 2
               3 | 3
               4 | 4
               5 | 5
              jetzt löscht du einen eintrag raus, dann sieht die tabelle so aus:
              Code:
              id | rid
               1 | 1
               3 | 3
               4 | 4
               5 | 5
              was für nen vorteil hat die spalte rid?
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                jetzt löscht du einen eintrag raus, dann sieht die tabelle so aus:
                Code:
                id | rid
                 1 | 1
                 3 | 3
                 4 | 4
                 5 | 5
                richtig. Jetzt füge ich wieder ein Recht hinzu und das Ganze sieht wieder so aus

                Code:
                id | rid
                 1 | 1
                 3 | 3
                 4 | 4
                 5 | 5
                 7 | 6
                und da ich in cw_userstatus die eindeutigen(!) Rechteids benütze bringen mir die ids gar nichts. hmm *nachdenk* die hab ich nur reingemacht, dass ich eben einen Wert drinhab der sich immer um eins erhöht. Eigentlich unnötig das die drin sind. Aber darum gehts grad ja nicht. Es ist nicht so, dass das unbedingt immer die gleichen Werte sind...

                cya CrazyPip

                Kommentar


                • #9
                  ich find mit der spalte rid, die du ja zum identifzieren der rechte nutzt, isses umständlicher, vor allem, wenn du ja schon ne spalte hast, die du nutzen kannst (kannst die ja auch rid nennen )
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    naja ok - ich denk du hast schon deine Gründe zu behaupten, dass das komplizierter wäre. Es geht mir darum: Wenn ich die userrechte verändere - sei es löschen, editieren, wieder hinzufügen usw - dann bringt mir die id mit auto_increment nichts, da egal was ich tue...die Zahl wird immer um eins erhöht, also: nehmen wir mal an ich lösche ein bestimmtes Recht mit der id = 3 - dann ist die gesamte Zeile weg (auch der eindeutige Wert 3). Wenn ich nun ein Userstatus mit dem recht belege wo der Wert eindeutig 3 sein soll und ich diesen in userrechte wieder hinzufügen möchte, dann macht der mir bei id nicht 3 sondern z.B. 7 (halt den maximalen Wert + 1)

                    somit stimmt die Tabelle userstatus nicht mehr. Wie gesagt, id ist nur drin damit ich einen Wert habe der immer um eins erhöht wird (hat doch kein Nachteil sowas dabei zu haben)

                    cya CrazyPip

                    Kommentar


                    • #11
                      wenn du einrecht editierst, aber die id nicht anrührst,is ja alles ok

                      die id rührst du nicht an, da du sie nur zur identifikation brauchst

                      löscht du ein recht, musst du alle einträge dieses recht betreffend auch aus der zuordnungstabelle cw_userstatus löschen (hab da vorhin was bei den codeschnipselngepostet, such da mal nach referentieller integrität)

                      tust du das nicht (das löschen), passiert dir auch nix, weil dann ein user zwar recht 3 haben kann, aber es das recht nicht mehr gibt => also kein problem und keine gefahr

                      wenn du jetzt allerdings nicht die id, sondern rid nimmst, und ein neues recht anlegst, dem den wert 3 für rid gibst, dann haben alle user, die vorher das alte recht haben, das neue jetzt auch (und das kann ungewollt sein)

                      stelldir mal folgendes vor
                      Code:
                      id | rid | beschreibung
                       3 | 3   | news eintragen
                      
                      id | uid | rid
                       1 |   1 | 3
                      jettz hat user 3 das recht 3, darf also news eintragen, wenn du das recht jetzt löscht und ein neues einfügst
                      Code:
                      id | rid | beschreibung
                       7 | 3   | forenbenutzer sperren
                      
                      id | uid | rid
                       1 |   1 | 3
                      kann der gleiche user plötzlich forenbenutzer sperren

                      während bei
                      Code:
                      rid | beschreibung
                        3 | news eintragen
                      
                      id | uid | rid
                       1 |   1 | 3
                      löschen des rechts und anlegendes neuen rechts
                      Code:
                      rid | beschreibung
                        7 | forenbenutzer sperren
                      
                      id | uid | rid
                       1 |   1 | 3
                      nix passiert (hab bei dem letzten beispiel den primärschlüssel der rechte-tabelle mal rid genannt (hieß vorher ja id))

                      für dich sogar der direktlink zur referentiellen integrität
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        hmmm

                        da hab ich mich aber ganz schön vertan ... wäre ja wohl net so gut wenn ein Boardmod nachher noch Systemadministrator wäre oder sowas.

                        hmm...stimmt du hast recht! Aber bei deiner Überlegung hat die rid-spalte kein auto_increment, oder?

                        ich hab mir deinen Link mal angeschaut. Leider kann ich mit referentieller integrität nichts anfangen, da ich keine ahnung habe was das genau ist.
                        Kannst du mir kurz erklären (am besten im code-schnipsel thread) was das ist und wie ich das benütze (würde mich wundern wenn ich der einzige wäre der das nicht weiss )

                        ok danke dir nochmal

                        cya CrazyPip

                        Kommentar

                        Lädt...
                        X