Anton Brass: Hilfe bei SQL-Abfrage

Moin!

Ich hab eine Tabelle:

ims_rgroupuser:

Spalten: group_ID, user_ID, rights_ID

Sie weißt einzelne User bestimmten Gruppen zu und speichert, welche Rechte diese User in der jeweiligen Gruppe haben.

Gibt es einen SELECT der mir die group_IDs für folgende zwei Bedingung holt:

  • user X mit user_ID=X und rights_ID=1 ist in der gesuchten Gruppe enthalten

  • user Y mit user_ID=Y darf nicht in dieser Gruppe enthalten sein.

Gruß

Anton

  1. Gibt es einen SELECT der mir die group_IDs für folgende zwei Bedingung holt:

    • user X mit user_ID=X und rights_ID=1 ist in der gesuchten Gruppe enthalten

    Logischer Fehler: Du kennst die Gruppe, du kennst den User und du kennst seine Rechte. Was bitte suchst du dann?
    Falls du das ernst meinst:
    "SELECT group_IDs FROM ims_rgroupuser WHERE user_ID='X' AND rights_ID='1' AND group_IDs='gesuchte Gruppe'"

    • user Y mit user_ID=Y darf nicht in dieser Gruppe enthalten sein.

    Definiere erstmal warum er nicht darin sein darf (aber auch hier, wenn du die Userid schon hast.. schau dir seine Rechte an und prüfe anhand deiner Kriterien ob er der Gruppe angehören darf oder nicht.)

    Sorry, aber deine Gedanken ergeben in der hier beschriebenen Form keinen logischen Sinn.

    1. Also probiere ich das noch ein bisschen auszuformulieren:

      Gegeben von user_X: user_ID und rights_ID

      Gegeben von user_Y: user_ID

      Gesucht:

      • Einzelner SQL-Select (nicht mehrere) der mir folgendes ausgibt:

      Die Gruppen (group_ID) in denen user_X Adminrechte hat (rights_ID), wobei user_Y nicht in diesen Gruppen enthalten sein darf.

      Grund:

      • user_X (Admin von verschiedenen Gruppen) soll user_Y in die Gruppen hinzufügen können, in denen user_Y noch nicht drin ist.

      • Es gibt eine vielzahl von Gruppen wo user_X nicht admin ist.

      1. Die Gruppen (group_ID) in denen user_X Adminrechte hat (rights_ID), wobei user_Y nicht in diesen Gruppen enthalten sein darf.

        "SELECT group_IDs FROM ims_rgroupuser WHERE user_ID='X' AND rights_ID='Adminrecht' AND user_ID!='Y'"

        Grund:

        • user_X (Admin von verschiedenen Gruppen) soll user_Y in die Gruppen hinzufügen können, in denen user_Y noch nicht drin ist.

        Alles klar.

        1. "SELECT group_IDs FROM ims_rgroupuser WHERE user_ID='X' AND rights_ID='Adminrecht' AND user_ID!='Y'"

          Hehe, wenns so einfach wäre, würd ich hier nichts posten.

          Dein Select holt mir nur die group_ID von dem User mit user_ID='X', wenn er Adminrechte in der Gruppe hat, mehr nicht.

          1. "SELECT group_IDs FROM ims_rgroupuser WHERE user_ID='X' AND rights_ID='Adminrecht' AND user_ID!='Y'"

            Hehe, wenns so einfach wäre, würd ich hier nichts posten.

            Dein Select holt mir nur die group_ID von dem User mit user_ID='X', wenn er Adminrechte in der Gruppe hat, mehr nicht.

            Du hast geschrieben:

            Gesucht:

            • Einzelner SQL-Select (nicht mehrere) der mir folgendes ausgibt:

            Die Gruppen (group_ID) in denen user_X Adminrechte hat (rights_ID), wobei user_Y nicht in diesen Gruppen enthalten sein darf.

            Also::

            SELECT group_IDs FROM ims_rgroupuser -> Hol mir die Gruppen
            WHERE user_ID='X' AND rights_ID='Adminrecht' -> Wo der Benutzer X Adminrechte hat
            AND user_ID!='Y'" -> Und Benutzer Y nicht vertreten ist.

            Wo ist jetzt etwas anders als du forderst?

            1. |group_ID|user_ID|rights_ID|
              ----------------------------
              |   1    |   1   |   1     |
              |   1    |   2   |   0     |
              |   2    |   1   |   1     |
              |   3    |   2   |   1     |
              ----------------------------

              Das wäre jetzt ein Beispiel für die ims_rgroupuser Tabelle.

              Ziel der Ausgabe ist group_ID: 2

              Wenn ich deinen SQL-Satz drauf anwende:

              kriege ich group_ID: 1 und 3

              Nachvollziehbar? Du schließt nur die zweite und vierte Spalte aus, durch  die WHERE-Anweisung, jedoch ist die erste Spalte davon unberührt!

              Gruß

              Anton

        2. Hi,
          also, damit ich dich richtig verstanden habe: user können in mehreren Gruppen sein...?

          Wenn ja geht das (meines Wissens und meiner Vorstellungskraft nach) nicht mit 1 Befehl. Ohne PHP (Perl...) geht das nicht.

          Du musst erst alle Gruppen ermitteln, wo user X Adminrechte hat.

          SELECT group_ID FROM ims_rgroupuser WHERE user_ID=X AND rights_ID=1

          Dann nimmst du die Ergebnisse und gehst einzeln alle Ergebnisse durch (mit einer foreach Schleife) und schaust, ob da user Y vorhanden ist.

          SELECT * FROM ims_rgroupuser WHERE user_ID=Y AND group_id='Foreachschleifenvariable'

          Wenn eine leer Menge zurückgegebn wird weißt du dass in der Gruppe Foreachschleifenvariable user X user Y hinzufügen kann.

          Du siehst ziemlich aufwendig und umständlich, weil deine Datenbankstruktur auch halbwegs chaotisch ist ;)

          Am besten ist du hast für jede Gruppe eine eigene Tabelle. Dort sind dann die dazugehörigen user mit ihren jewailigen Rechten in dieser Gruppe verzeichnet. Ein weiterer Schritt wäre eine Tabelle für jeden User, wo dann Verweise zu den Gruppen zu finden sind, in der er ist, und auch seine jewailigen Rechte. So könntest du dann einfach per

          SELECT group_ID FROM user_x_db WHERE rights_id=1

          zum gewünschten Ergebnis kommen.

          "SELECT group_IDs FROM ims_rgroupuser WHERE user_ID='X' AND rights_ID='Adminrecht' AND user_ID!='Y'"

          ? Nee, das geht nicht, user_ID kann ja nicht X und Y gleichzeitig sein!

          Ich rate dringend zum Mehrtabellensystem, es ist zwar programmieraufwendiger aber dafür hast du dann eine saubere Datenbankstruktur.

          MfG

          1. Gibt es hier keine Möglichkeit seine Posts zu editieren? Naja, nachgereicht

            Nee, das geht nicht, user_ID kann ja nicht X und Y gleichzeitig sein!

            War natürlich falsch, ich meinte wenn user_ID=X ist ist es immer ungleich Y

          2. Hallo

            also, damit ich dich richtig verstanden habe: user können in mehreren Gruppen sein...?

            Wenn ja geht das (meines Wissens und meiner Vorstellungskraft nach) nicht mit 1 Befehl. Ohne PHP (Perl...) geht das nicht.

            Selbstverständlich geht das. Lesen bildet.

            Ich rate dringend zum Mehrtabellensystem, es ist zwar programmieraufwendiger aber dafür hast du dann eine saubere Datenbankstruktur.

            Was hast Du an dieser Tabelle auszusetzen? Sie ist sauber und sinnvoll. Jede Änderung würde die Datenbankstruktur "verschmutzen".

            Freundliche Grüße

            Vinzenz

  2. Hallo Anton

    ims_rgroupuser:
    Spalten: group_ID, user_ID, rights_ID
    Gibt es einen SELECT der mir die group_IDs für folgende zwei Bedingung holt:

    • user X mit user_ID=X und rights_ID=1 ist in der gesuchten Gruppe enthalten
    • user Y mit user_ID=Y darf nicht in dieser Gruppe enthalten sein.

    Folgendes ungetestetes Statement sollte dies liefern:

    SELECT DISTINCT -- Du möchtest die Gruppen ja nur einmal haben  
        group_ID  
    FROM ims_rgroupuser  
    WHERE  
        user_ID = X     -- Deine erste Bedingung  
    AND  
        rights_ID = 1   -- Deine zweite Bedingung  
    AND  
        group_ID NOT IN (          -- group_id nicht in der Menge  
            SELECT  
                g.group_ID         -- aller Gruppen  
            FROM ims_rgroupuser g  
            WHERE g.user_ID = Y    -- in denen sich Benutzer Y befindet  
        )                          -- => Deine dritte Bedingung  
    
    

    praktisch die wörtliche Übersetzung Deiner Bedingungen. Dieses Statement ist von den meisten Datenbankmanagementsystemen problemlos ausführbar. Beim weitverbreiteten MySQL werden Subselects jedoch erst ab Version 4.1 unterstützt.

    Freundliche Grüße

    Vinzenz

    1. Moin!

      Vinzenz ich glaub das klappt.

      Ich wusste gar nicht, dass man nochmal einen SELECT-Befehl aufrufen kann.

      Hast du zufällig da bissel online Material dazu? :D

      Danke auch an die anderen die mitgedacht haben ;-)!

      Gruß

      Anton

      1. Hallo Anton,

        Ich wusste gar nicht, dass man nochmal einen SELECT-Befehl aufrufen kann.

        Hast du zufällig da bissel online Material dazu? :D

        hatte ich Dir doch schon verlinkt. Speziell für IN siehe Subqueries with ANY, IN, and SOME; dieser Abschnitt sollte über das Inhaltsverzeichnis sehr leicht zu finden sein.

        Freundliche Grüße

        Vinzenz

    2. yo,

      SELECT DISTINCT -- Du möchtest die Gruppen ja nur einmal haben

      group_ID
      FROM ims_rgroupuser
      WHERE
          user_ID = X     -- Deine erste Bedingung
      AND
          rights_ID = 1   -- Deine zweite Bedingung
      AND
          group_ID NOT IN (          -- group_id nicht in der Menge
              SELECT
                  g.group_ID         -- aller Gruppen
              FROM ims_rgroupuser g
              WHERE g.user_ID = Y    -- in denen sich Benutzer Y befindet
          )                          -- => Deine dritte Bedingung

        
      sollte nicht funktionieren, da es keinen bezug gibt, dass sich user x und user y ín der gleichen gruppe befinden. und wenn ich das richtig verstehe, führt user Y nur zum ausschluss, wenn sie in der gleichen gruppe sind. dazu müsste man eine korrelierende unterabfrage anbringen, würde aber eventuelle auch ohne unterabfragen mit einen GROUP BY gehen.  
        
      Ilja
      
      1. yo,

        ignorriere einfach diesne post Vinzenz....

        Ilja

        1. Hallo Ilja,

          ignorriere einfach diesne post Vinzenz....

          klar, mache ich. Meine Antwort ist bereits im Papiereimer.

          Ich habe aufgrund Deines Beitrags gerade mein Statement mit Antons Daten durchgetestet und freue mich, dass Du inzwischen meiner Meinung bist. Das Statement liefert genau das richtige Ergebnis :-)

          Freundliche Grüße

          Vinzenz

          1. yo,

            Ich habe aufgrund Deines Beitrags gerade mein Statement mit Antons Daten durchgetestet und freue mich, dass Du inzwischen meiner Meinung bist. Das Statement liefert genau das richtige Ergebnis :-)

            naja, ich habe da ein wenig vorschnell geschrieben, weil du ja keinen direkten abgleich der gruppen hast. aber dadurch, dass du alle gruppen von Y rein nimmst und dann abfragst, ob eine damit von X übereinstimmt ist das ja quasi ein abgleich....

            Ilja