Erstellung von Terminverwaltung-Tabelle(n)

worker

worker

König
Moin @ll,

ich bräuchte etwas Hilfe/Anregung bei einem privaten Projekt.
Es geht darum, dass eine Terminverwaltung aufgestellt werden soll.
(Die Nachrichtenverwaltung (like E-Mails) steht und war vergleichsweise einfach zu bewältigen für mich.)

Die Termine sollen aber nur von bestimmten Usern bzw. Gruppen einsehbar sein.

Zuerst dachte ich an eine Tabelle: 'id' | 'termindatum' | 'ersteller' | 'termin_text' | 'zugriff_gruppe' | 'zugriff_user'
Dies würde auch funktionieren, bis auf 'zugriff_user'. Denn hier müsste ja eine Liste in diesem Feld erstellt werden.
Doch ich denke mir, dass dieses Vorgehen umständlich zu händeln wäre und auch nicht im Sinne von SQL ist.
(Wäre ja quasi eine Tabelle in einer Tabelle wäre.)

Ich fürchte (weil ich das mit den Tabellen-Verknüpfungen (noch) nicht blicke), dass ich um zwei Tabellen nicht
herum kommen werde.
Doch mit zwei (bzw. mehreren) Tabellen komme ich überhaupt nicht auf einen "grünen Zweig". Weiss weder
wie das jetzt aussehen, noch wie ich das angehen soll mit zwei Tabellen. Wo in welcher Tabelle soll was
verwaltet/eingetragen werden?

Für Ideen, Vorschläge, etc wäre ich sehr dankbar.

Merci
Worker
 
Hallo worker,

das gleiche Problem kann sich dann auch mit der Spalte 'zugriff_user' stellen, oder? Vielleicht willst Du ja doch einzelne Termin mehreren Gruppen zur Verfügung stellen.

Gruß Lilly
 
Hallo Lilly,

hm, das stimmt allerdings auch wieder. Soweit hatte ich nicht gedacht. Demnach müsste ich wohl mit sogar mehr als zwei Tabellen arbeiten? *grübel*
 
Hallo worker,

und die nächste Normalisierungsüberlegung wäre, ob ein User nicht auch mehereren Gruppen zugeordnet werden kann (1:n-Beziehung)?
 
Hmmm,

da sind wir schon bei mindestens 4 Tabellen *schwitz* :-) ...

Würde es erstmal so (mit PHP/MySQL) gehen? ...

Tabelle 1 [Nur Termine]:
'id' | 'ersteller' | 'termindatum' | 'termin_text'

Tabelle 2 [Welcher User auf welche Tabelle-1-id zugreifen darf]:
'id' | 'zugriffs_user' | 'zugriff_auf_tabelle_1-id'

Tabelle 3 [Welche Gruppe auf welche Tabelle-1-id zugreifen darf]:
'id' | 'zugriffs_gruppe' | 'zugriff_auf_tabelle_1-id'

Tabelle 4 [User <-> Gruppen - Zugehörigkeit]
'id' | 'user' | 'zugehörige_gruppe'

Wird das nicht zu kompliziert bei Abfragen usw. ?
 
Hallo worker,

ja, so sollte es funktionieren. Allerdings musst Du die letzte Tabelle noch einmal überdenken, denn Du hast ja hier eine n:m-Beziehung, also ein User kann in einer oder mehreren Gruppen sein (oder vielleicht sogar in keiner?) und eine Gruppe hat mehrere Mitglieder.

Gruß Lilly
 
Hi Lilly,

Also soweit so gut ...
Wegen der User<->Gruppen - Zuweisung bin ich mir da jetzt nicht ganze sicher.
Tabelle 4 könnte man - denke ich - so belassen, denn sogar für jede Gruppe könnte der gleiche User eingetragen werden.

Allerdings könnte man auch (nach reichlich Nachdenken ^^) jedesmal eine neue Gruppen-Tabelle erstellen.
Dies würde dann wohl so aussehen (kurz und knapp):
Tabelle X [GruppenName]:
'id' | 'zugehöriger_user'

Wäre das aber nicht zu "overload" da jedesmal für eine neue Gruppe eine eigene Tabelle zu erstellen?

Ansonsten danke ich Dir sehr für's "an die Hand nehmen" :-).

LG
Worker
 
Bei einer n:m Beziehung bildet man einfach eine Zwischentabelle UserZurGruppe bei der der Primärschlüssel der Usertabelle und der Primärschlüssel der Gruppe verwendet wird. Zusätzlich können dort noch weitere Informationen gespeichert werden (falls nötig), wie z.B. ein Datum, ......
 
@Arch,

aha - also alle Tabellen oben werden erstmal so geändert, dass ich nicht mit namen, sondern IDs (z.B. user_id, etc.)
arbeite. Dann wird Tabelle 4 wird geändert in:
'user_id' | 'gruppe_id'

Demnach muss ich zu guter Letzt nur noch eine Tabelle mit den Gruppen anlegen:
Tabelle 5 [Gruppen]:
'id' | 'gruppe_name'

Ist das so richtig? Kein Denkfehler drinnen?

Merci
Worker

Nachtrag:
Noch ne Frage: Schreibt man besser die IDs in der ersten Spalte so, wie ich es immer tue, oder doch lieber ausgeschrieben (z.B. in Tabelle 5: statt 'id' --> 'gruppe_id') ?
 
Zuletzt bearbeitet:
Also keine Ahnung, ob meine Fragen im Post #9 iwie doof waren ....

Doch jetzt hätte ich eine weitere Frage (nach einigen Tagen an Herumgebastel) - und zwar zum MySQL-"SELECT".
U.a. habe ich folgenden SELECT versucht, doch das Ergebnis ist "leer":
PHP:
mysql_query("SELECT g.id, ug.user_id FROM gruppen AS g INNER JOIN user_gruppe AS ug ON g.id=ug.gruppe_id AND ug.user_id='$user_id'") or die(mysql_error());
Es wird anscheinend nichts selektiert.
$user_id hat einen korrekten Wert vor der Abfrage.

Ich weiss nicht, ob die Syntax falsch ist, oder was ich sonst falsch gemacht haben könnte bei der SELECT-Anweisung.

LG
Worker
 
Code:
SELECT g.id, ug.user_id FROM gruppen AS g INNER JOIN user_gruppe AS ug ON g.id=ug.gruppe_id WHERE ug.user_id='$user_id'

...sollte das sein was du suchst :)
 
@Arch

hoppla ... hätte mich auch treten können, ein WHERE anstatt von AND zu nehmen ^^

Danke :)

War jetzt einige Tage weg - werd mich morgen wieder dran setzen.

LG
Worker
 
Sodele, Mädels .... und Jungs *g*

Bin am Ende mit meinem Latein und Google mag auch nimmer :P

Folgenden Select verwende ich, damit ich an die Termine rankomme - und zwar sollen die Termine der Gruppe ausgegeben werden, in denen (der Gruppen) der User eingetragen ist:
Code:
SELECT *
FROM termine AS t
JOIN gruppen AS g
JOIN user_gruppen AS ug
JOIN gruppe_termin AS gt
ON g.id=ug.gruppe_id WHERE ug.user_id='$user_id'
AND gt.termin_id=g.id
AND t.id=gt.termin_id
AND t.termin_datum='$date_today_timestamp'
LIMIT 20
Ich schätze mal, dass das nicht ganz so korrekt ist, was ich da hingeschmiert habe, aber selbst LEFT und RIGHT JOINs bringen das gleiche Ergebnis. Nämlich Nix (Wie Flasche leer).
Worauf ich dann Zugriff haben möchte sind Felder in der Termine-Tabelle (Betreff und Uhrzeit).

Kriech ich einen Beistand bitte? *klimperklimpermitderaugenwimper* :)
 
Ich weiß nicht so ganz, wie deine Tabellen jetzt ausschauen, aber mMn vergleichst du eine Termin-ID mit einer Gruppen-ID (siehe "AND gt.termin_id = g.id")
 
Darf ich mal fragen was du mit solchen Abfragen erreichen willst? Du kannst dir natürlich die Daten auch in mehreren SQL-Abfragen holen und brauchst nicht eine Superman-SQL-Abfrage basteln :D .
Weist du was ein RIGHT- oder ein LEFT-JOIN bedeutet, da sollte man nicht einfach so damit rumwerfen :) . Ein kleiner Tipp, die Namen kommen aus der Mengenlehre, zwei Mengen -> LEFT-/INNER-/RIGHT-JOIN :) .

Generell zu JOINS:
- Jedes JOIN-Statement braucht ein ON Statement ->
Code:
gruppe JOIN gruppe_zwischen ON gruppe.i = gruppe_zwischen.b
- Du verschachtelst die JOINS miteinander:
Code:
FROM Tabelle1 JOIN (Tabell2 JOIN Tabelle3 ON Tabelle2.id = Tabelle3.id) ON Tabelle1.id = Tabelle2.id
--> Bei mehreren Tabellen wird das natürlich immer weiter verschachtelt.

Das was du hast ist eine Mischung. Du musst in SQL-Abfragen nicht zwingend die JOINS nehmen, die sollen dir nur deine Arbeit erleichtern und von den WHERE-Bedingungen weg kommen. Du kannst es auch wie du machen und einfach nur die Tabellen selektieren und über die WHERE-Klausen alle Bedingungen festlegen.
Code:
SELECT *
FROM ALLE TABELLEN AUFLISTEN OHNE JOIN
WHERE tabelle1.id=tabelle2.id AND tabelle2.id = tabelle3.id AND ....
Nichts anderes wird durch die JOINS durchgeführt. Der Vorteil dabei ist dass du noch weitere Möglichkeiten hast das ganze zu Selektieren, z. B. mit einem LEFT-/RIGHT-/CROSS-/....-JOIN. Das ist in den WHERE-Bedingungen dann schon schwieriger umzusetzen (im Vergleich zum JOIN).

Generell solltest du dir vielleicht nochmal ein Buch oder ein Tutorial zu JOINS durchlesen :) .
 
@daboss:
Mit dem "gt.termin_id = g.id" möchte ich eigentlich erreichen, dass in der Tabelle "gt" die Termin-IDs ausgewählt werden sollen, die eine Verknüpfung zu einer Gruppen-ID haben:
"Gruppe-Termin"-Tabelle:
'id' | 'gruppe_id' | 'termin_id'
Ich denke, das ist soweit (logisch gesehen) ok, oder?


@Arch:
Naja, laut Google-Funden sind solche Abfragen performanter - mal abgesehen davon, dass ich auch schon ein Ergebnis nach dem anderen von den Tabellen abgefragt hatte, ich aber nicht zum gewünschten ergebnis kam (einmal kamen ergebisse dreifach und dann wieder garnicht, usw.).

Das mit RIGHT- und LEFT JOIN habe ich ansatzweise *hoff* begriffen - wollte damit oben auch nur sagen, dass ich alle mir bekannten Varianten bei meinem Problem versucht habe anzuwenden.

Es ist für mich einfach (egal auf welcher Webseite) nicht leicht das ohne gute Beispiele zu verstehen/nachzuvollziehen, aber Deine Erklärungen bringen schon viel Licht ins Dunkle. Danke.

Ich werde also dann man schauen, wie und ob ich's gebacken bekomme :) ...

Vielen Dank erstmal.
LG
Worker
 
Zuletzt bearbeitet:
Also echt, ich hab mein Bestes versucht - sowohl vom Verständnis her, wie auch von der "Bastelei" ...

PHP:
$result = mysql_query("SELECT * FROM termine AS t
JOIN
    gruppe_termin gt ON gt.termin_id=t.id AND t.termin_datum='$date_today_timestamp'
JOIN
    user_gruppe ug ON gt.gruppe_id=ug.gruppe_id AND ug.user_id='$user_id'
LIMIT 20") or die(mysql_error());

Also in meinen einfachen, bescheidenen Worten heisst doch diese Abfrage:
Code:
SELEKTIERE alles VON termine (= t)
VEREINE MIT TABELLE
    gruppe_termin gt WO gt.termin_id=t.id AND t.termin_datum='$date_today_timestamp'
    (zu Deutsch: WO in Tabelle "gruppe_termin" die Spalte "termin_id" mit der Spalte "id" in Tabelle "termine"
     übereinstimmt UND in der Tabelle "termine" die Spalte "termin_datum" = 'heutiges_datum')
VEREINE DANN WEITER MIT
    user_gruppe ug WO gt.gruppe_id=ug.gruppe_id AND ug.user_id='$user_id'
    (zu Deutsch: WO in Tabelle "gruppe_termin" die Spalte "gruppe_id" mit der Spalte "gruppe_id" in Tabelle
    "user_gruppe" UND die Spalte "user_id" = "ID des Users" in Tabelle "user_gruppe")
Habe ich das soweit richtig gecheckt?

Falls ja, warum erhalte ich dann nur "leere Felder/Ausgaben" bei:
PHP:
while( ($row = mysql_fetch_array($result)) )
{
  $termin_betreff = $row['t.betreff'];
  $termin_von = $row['t.uhrzeit_von'];
  $termin_bis = $row['t.uhrzeit_bis'];
  echo "Betreff: ".$termin_betreff."&nbsp;[ ".$termin_von." - ".$termin_bis." h ]\n";
}
?
(Wobei die Anzahl der "leeren Ausgaben" stimmt *kratz*.)
 
daboss, nein - siehste hätt ich tun können, aber ich hab anstatt
PHP:
$termin_betreff = $row['t.betreff'];
einfach mal
PHP:
$termin_betreff = $row['betreff'];
(also ohne das "t." (bzw. testweise war's auch "termine.betreff"))
versucht, und siehe da, es geht so.
Kann man wirklich nicht per "t.betreff" bzw. "termine.betreff"
auf die eintsprechenden Spalten zugreifen?
Also das fände ich nicht so gut, wenn man z.B. auf ne spezielle
"ID"-Spalte zugreifen will(?). Oder gibt es da andere Wege?
 
Viele Empfinden PHP als keine schöne Sprache, Geschmacksache. Was jemand jedoch nicht bemägneln kann ist die Doku und die Beiträge darunter :) . Lohnt sich teilweise wirklich, da findest du meistens genau das, was du haben willst :) .
Tablename.Columname
 
Zurück
Oben