Aquariophile: MySQL - Ein User gehört Gruppen an

Hallo!

Zugegebenerweise ist das Topic echt etwas doof,
aber es ist schwer das besser zu formulieren.

Also es geht darum:
Ein Programm versendet E-Mails an user.

Auswahl findet nach gruppen statt.

Beispiel

_______________________________________________
 User     |      Name       |      Gruppe
_______________________________________________
 Aqua     |     Watzinger   |         3
_______________________________________________

Wenn ich nun also an Gruppe 3 eine Mail versenden würde,
dann würde diese Mail unter anderem an user "Aqua" gehen.

Nun kommt aber der Hit:
Ein user kann mehreren Gruppen angehören.

Beispielsweise soll der User "Aqua" den Gruppen
1, 3, und 8 angehören.

Die Lösung die für mich NICHT in Frage kommt,
ist die Gruppen alle in ein Feld zu schreiben,
und dann zu splitten.

Weil dann laufe ich am sinn einer Datenbank vorbei.

Meine Frage ist, wie ich die Tabellenstruktur aufbauen soll,
dass ich einen user mehreren Gruppen zuteilen kann,
wenn...

  • nicht bekannt ist wieviele Gruppen es schlussendlich geben wird
  • ein User mehreren Gruppen angehört
  • der User nicht mehrere Mails bekommt, wenn die Gruppe mehrmals vorkommt

ok, also was meine ich mit "nicht mehrere Mails bekommt" ?

Ich will es erklaeren,
wenn Aqua wie gesagt den Gruppen 1, 3 und 8 angehoert,
und eine Mail soll versandt werden,
welche von allen Usern der Gruppe 1,2,3  6,7,8, und 9 empfangen werden soll,
dann würde ja der Aqua insgesamt 3 gleiche Mails bekommen.

DAs darf keinesfalls passieren!!

Danke!
LG Aqua

  1. Moin!

    Nun kommt aber der Hit:
    Ein user kann mehreren Gruppen angehören.

    Beispielsweise soll der User "Aqua" den Gruppen
    1, 3, und 8 angehören.

    Die Lösung die für mich NICHT in Frage kommt,
    ist die Gruppen alle in ein Feld zu schreiben,
    und dann zu splitten.

    Dann mußt du zwei Tabellen machen. Eine enthält alle Userangaben und eine eindeutige User-ID, die zweite enthält die User-ID aus Tabelle 1 sowie ein Feld "Gruppe", in das jeweils eine zugehörige Gruppe eingetragen wird.

    Wenn ein User mit der ID 3 (Daten zu dieser ID stehen in Tabelle 1) mehreren Gruppen angehören soll, sind mehrere Einträge in Tabelle 2 vorhanden:

    User-ID  Gruppe
      3        1
      3        5
      3        8

    Damit ist der datenbanktechnische Teil eigentlich geklärt. Bleiben nur noch die Abfragen.

    ok, also was meine ich mit "nicht mehrere Mails bekommt" ?

    Ich will es erklaeren,
    wenn Aqua wie gesagt den Gruppen 1, 3 und 8 angehoert,
    und eine Mail soll versandt werden,
    welche von allen Usern der Gruppe 1,2,3  6,7,8, und 9 empfangen werden soll,
    dann würde ja der Aqua insgesamt 3 gleiche Mails bekommen.

    Du suchst alle User, die den Gruppen gehören, denen du Mails schicken willst. Die gefundenen User-IDs kommen dann mehrfach vor. Damit keiner doppelte Mails kriegt, mußt du "nur" dafür sorgen, dass mehrfache IDs zu einer einzelnen ID zusammengefaßt werden.

    In MySQL gibt es dafür sowohl DISTINCT als auch GROUP BY.

    Es kann aber durchaus schwierig werden, das in MySQL in _ein_ SQL-Statement zu packen. Da deine Aufgabe ein wenig nach Massenmailing aussieht, dürftest du unter Umständen ohnehin in die Laufzeitbegrenzung von PHP geraten und mußt folglich irgendwie das Mailen in Zwischenschritte aufteilen.

    - Sven Rautenberg

    --
    "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
    1. Servus Sven :)

      Du bist irgendwie immer im Forum wenn man Dich braucht *g*

      Das mit der Laufzeitbegrenzung habe ich noch nicht gecheckt.
      Ich dachte die User schmeisse ich ein einen Array,
      gehe jedes Element mit einer Schleife einzeln durch,
      und öffne sendmail für jeden User neu.

      Bitte um Deine Einwaende!

      PS.: Sprache ist Perl.

      PPS.: Verraetst Du mir wie die Abfragezeile auszusehen haette,
      die die user herrausholt in MySQL und verhindert,
      dass ein User mehrfach selectiert wird?

      Die beschreibungen von Distinct erklaeren diesen Fall nicht.

      Danke!
      Aquariophile

      1. Hallo Aqua,

        PPS.: Verraetst Du mir wie die Abfragezeile auszusehen haette,
        die die user herrausholt in MySQL und verhindert,
        dass ein User mehrfach selectiert wird?

        SELECT DISTINCT 'User-ID' FROM Gruppen WHERE Gruppe IN (1,3,5);

        Beachte bitte: In Spaltennamen sind gewisse Zeichen nicht gern gesehen.

        PS: Die MySQL-Doku ist da eigentlich sehr klar ...

        Gruss,

        Vinzenz

        --
        Die FAQ </faq/> des Forums sind lesenswert und hilfreich.
        1. Danke Vinzenz!

          LG
          Aqua

    2. Danke Sven!

      LG
      Aqua