Query mit sich selbst referenzieren?

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

  • Query mit sich selbst referenzieren?

    Hallo,


    Ich suche einen Ansatz für ein Problem, welches sich mir stellen wird - zumindest von der Planung bzw. den Planungsgedanken her.

    Zuerst eine kurze Erklärung was es am Ende werden soll. Auch wenn es den PHP-Bereich streifen wird, so denke ich, dass es doch eine Lösung in MySQL geben wird.
    In einem System sind verschiedene User für verschiedene Bereiche zuständig bzw. verantwortlich. Damit dabei aber sichergestellt werden kann, dass nicht der eine oder andere viel mehr als die anderen mit arbeiten, soll es eine Beschränkung auf maximal drei Bereiche geben.
    Das Ganze wäre einfacher zu lösen, wenn man vor dem Speichern (also nachdem der Speicher-Button betätigt wurde) eines neuen Bereichs prüft, ob diese Grenze schon erreicht wurde oder nicht. Aber das macht ja auch keinen Sinn, wenn man dem Bearbeiter alle Usernamen ausspuckt, jedoch nur eine gewisse Anzahl davon überhaupt in Frage kommen würden aufgrund der genannten Grenze.
    Demzufolge sollten schon bei der Auswahl nur jene Usernamen erscheinen, welche diese Grenze noch nicht erreicht haben und genau dafür fehlt mir der sinnvollste Ansatz. Hätte da zwar einen, aber den empfinde ich etwas sehr umständlich, weil dieser mehrere Query's (mind. zwei) und Kontrollstrukturen/Schleifen benötigt.

    Die dazugehörigen Tabellen sind ziemlich einfach aufgebaut

    - bereiche (sind die Bereiche selbst)
    -> id (auto_increment, primarykey)
    -> bereichsname (text)
    -> und noch weitere die aber hierbei nicht von relevanz sind

    - zu_bereich (Relationstabelle zu User und Bereiche)
    -> id (auto_increment, primarykey)
    -> userid (Id des Users)
    -> bereichsid (Id des Bereichs)


    Ist es nun möglich, einen Query so zu gestalten, dass er die gleichen Inhalte zählt und mir nur jene ausgibt welche noch keine drei mal vorhanden sind?

    So in der Art von
    Code:
    // ...
    COUNT(userid) as c_UserId FROM zu_bereich WHERE c_UserId <= '2' 
    // ...
    Also so, dass im selben Query schon die WHERE-Bedingung vom Ergebnis profitiert. Ist sowas überhaupt möglich, bzw. gibts da einen besseren Ansatz?
    Der Rest drum rum (JOINs, etc.) ist kein Problem, es happert aber an der Idee zum Erklärten.


    Gruss

  • #2
    Das sollte klappen.

    GROUP BY nicht vergessen...
    Wir werden alle sterben

    Kommentar


    • #3
      Habe ich doch glatt eben mal getestet..

      Code:
      SELECT 
      j.UserId AS uid, j.UserName AS UserName, c.bereichsname AS name, COUNT(z.UserId) AS c_uid 
      FROM User j
      JOIN zu_bereiche z ON (j.UserId = z.UserId) 
      JOIN bereiche c ON (z.bereichsid = c.id) 
      WHERE (/* versch. Rechte die vorhanden sein müssen */) AND c_uid <= '2' 
      GROUP BY z.UserId 
      ORDER BY c.bereichsname, j.UserName
      ... liefert ein Unknown column 'c_uid' in 'where clause'

      Das die Tabelle 'zu_bereiche' noch leer ist, dürfte dabei keine Rolle spielen, oder?

      Kommentar


      • #4
        Du kannst in der WHERE-Klausel keine Alias verwenden;
        und für das, was du vorhast, solltest du sowieso HAVING stattdessen nutzen.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Ein..

          Code:
          SELECT 
          j.UserId AS uid, j.UserName AS UserName, c.bereichsname AS name 
          FROM User j
          JOIN zu_bereiche z ON (j.UserId = z.UserId) 
          JOIN bereiche c ON (z.bereichsid = c.id) 
          WHERE /* versch. Rechte die vorhanden sein müssen */ 
          GROUP BY z.UserId 
          HAVING COUNT(z.UserId) <= '2' 
          ORDER BY c.bereichsname, j.UserName
          ... liefert schon mal keinen Fehler mehr. Allerdings ist die Ergebnismenge null. Klingt auf der einen Seite logisch weil die Tabelle leer ist. Auf der anderen Seite aber, erfüllt auch eine leere Tabelle das Kriterium 'weniger als 3' (der HAVING-Klausel). Es müssten also alle möglichen UserNamen ausgegeben werden?!
          Möglich das es am JOIN liegt, der nur Usernamen holt die auch in der (noch leeren Tabelle) zu finden wären? Also wäre auch im Falle einer nicht leeren Tabelle das Ergebnis falsch, wie ich meine.
          Wie muss ich die Sache nun angehen um das zu umgehen?

          Kommentar


          • #6
            Hallo,


            Da ich keine Möglichkeit finden konnte das in einem Query abzufragen, habe ich das nun auf zwei verteilt und benutze dann die Array-Funktionen um ans Ziel zu kommen. Funktioniert wie es soll, auch wenn es etwas mühsam zu machen war.


            Danke

            Kommentar


            • #7
              Hallo

              Obwohl das Problem gelöst zu sein scheint, möchte ich trotzdem zum Join noch etwas anmerken. Du hättest schon die User bekommen die auch noch keinem Projekt zugeordnet sind weil die zu_bereiche-Tabelle leer ist, wenn du ein LEFT LOIN verwendet hättest:

              [FONT=monospace]from User j
              LEFT JOIN [/FONT]zu_bereiche z ...

              Kommentar

              Lädt...
              X