mysql: Brauche etwas Hilfe beim query-Bau
AllesMeins
- datenbank
0 Cheatah0 AllesMeins0 Cheatah0 Axel Richter
0 Ilja
Hiho,
ich sitze mal wieder vor einem mysql Problem bei dem ich zwar weiss was passieren soll aber nicht wie ich das mysql sage. Folgendes:
Ich habe zwei Tabellen in einer sind Benutzer gespeichert in der zweiten Zugriffsrechte der Benutzer auf verschiedene Seiten. Die Rechte sind in folgendem Format gespeichert:
UserID
Seite
lesen [1/0]
ändern [1/0]
Um Platz zu sparen sind in der Rechtetabelle nicht für jeden User und jede Seite ein Datensatz sondern es ist nur dann ein datensatz eingetragen wenn der Benutzer entweder lesen oder schreiben darf.
Nun will ich gerne für die Seite X alle benutzer mit Rechten ausgeben (also auch die Benutzer die keine Zugriffsrechte auf die Seite X haben und deshalb auch keinen Eintrag in der rechte-Tabelle). Wie mache ich das? Ich habe bisher dieses hier:
SELECT user.user, rechte.r, rechte.w FROM rechte LEFT JOIN user ON rechte.user = user.ID WHERE rechte.page = '%SEITE%'
Das gibt mir aber nur die Benutzer zurück zu denen auch ein Eintrag zur Seite X in der Rechtetabelle ist. Wie bekomme ich alle User?
Grüsse
Marc
Hi,
Das gibt mir aber nur die Benutzer zurück zu denen auch ein Eintrag zur Seite X in der Rechtetabelle ist. Wie bekomme ich alle User?
mit einem Outer Join.
Cheatah
Hiho,
was muss ich an dem query alles ändern damit das Funktioniert. Einfach nur ein 'LEFT OUTER JOIN' draus zu machen ändert am Ergebniss nälich gar nichts:
SELECT user.user, rechte.r, rechte.w FROM user LEFT OUTER JOIN rechte ON user.ID = rechte.user WHERE rechte.page = '%SEITE%'
Grüsse
Marc
Hi,
was muss ich an dem query alles ändern damit das Funktioniert. Einfach nur ein 'LEFT OUTER JOIN' draus zu machen ändert am Ergebniss nälich gar nichts:
vielleicht ist es ein Right Outer Join. Ich muss gestehen, dass ich mich mit der MySQL-Syntax an dieser Stelle nicht anfreunden kann.
Cheatah
Hallo,
was muss ich an dem query alles ändern damit das Funktioniert. Einfach nur ein 'LEFT OUTER JOIN' draus zu machen ändert am Ergebniss nälich gar nichts:
SELECT user.user, rechte.r, rechte.w FROM user LEFT OUTER JOIN rechte ON user.ID = rechte.user
WHERE rechte.page = '%SEITE%'
Diese Bedingung kann nur zutreffen, wenn ein entsprechender Wert in der Tabelle rechte vorhanden ist. Der Join beinhaltet zwar alle Datensätze aus user, allerdings ist der Wert von rechte.page NULL, wenn kein Datensatz gejoint werden kann. Du willst also auch die Datensätze des JOINs, bei denen rechte.page = NULL.
viele Grüße
Axel
yo,
Um Platz zu sparen....
davon würde ich abraten. speicherplatz ist heutzutage nicht mehr so ein starkes kriterium, eher übersichtlichkeit. liegt den wirklich ein akutes speicherproblem vor ?
bei deiner eintelung habe ich schwierigkeiten, die rechte zuzuordnen, bin noch nicht ganz hinter das system gestiegen. entweder/oder schließt sich eigentlich gegenseitig aus, sprich entweder kann er lesen oder aber schreiben aber nicht beides. das stele ich mir nun schierig vor, etwas zu schreiben ohne lesen zu dürfen. und wie unterscheide ich jemanden, der lesen und schreiben darf, von jemaden der werder schreiben noch lesen kann. da stiege ich noch nicht durch.
der join ist falsch rum, sprich du gehst nicht von den rechten aus, sondern von den usern. schließlich wilst du alle user datensätze haben und nicht alle rechte datensätze.
SELECT user.user, rechte.r, rechte.w FROM user LEFT JOIN rechte ON rechte.user = user.ID WHERE rechte.page = '%SEITE%'
Ilja
Hiho,
davon würde ich abraten. speicherplatz ist heutzutage nicht mehr so ein starkes kriterium, eher übersichtlichkeit.
Ja, aber auch die leidet wenn ich lauter Einträge mit 'User A darf nicht lesen und nicht schreiben' in der Tabelle habe. Deshalb habe ich halt nur die Benutzer die etwas auf der Seite machen dürfen in der Tabelle gespeichert.
bei deiner eintelung habe ich schwierigkeiten, die rechte zuzuordnen, bin noch nicht ganz hinter das system gestiegen.
Eigentlich ganz simpel:
Rechte Tabelle:
|user|Seite|r|w|
----------------
|ABC |index|1|1|
|ABCD|index|0|1|
|BCDE|index|1|0|
Ich hoffe mal das wird jetzt nicht vollkommen zerroppt:
User ABC darf die Seite lesen (bzw. ausführen da es sich auch um PHP Code handeln kann) und ändern, User ABCD darf die Seite nur ändern (was zugegebenermassen wenig Sinn macht) und User BCDE darf die seite nur ansehen. Alle anderen Benutzer dürfen die Seite weder ansehen noch ändern...
der join ist falsch rum, sprich du gehst nicht von den rechten aus, sondern von den usern. schließlich wilst du alle user datensätze haben und nicht alle rechte datensätze.
Damit habe ich schon wild rumprobiert. Weder das eine noch das andere spuckt mir alle Benutzer aus. Gibt es nicht so etwas wie 'Lies alle Nutzer aus und gib sie zurück, falls zu dem Nutzer ein eintrag in der rechte Datei existiert überprüfe ob die Seite stimmt und gib auch dies zurück'
Ich will quasi eine Aufstellung für die Seite 'index' machen über alle User und was sie dürfen (und dazu gehören auch die die nichts dürfen - sprich keinen eintrag in der rechte-Tabelle haben)
Grüsse
Marc