Hi,
Mit EINE meinst du, dass du jeweils nur an einer rightid interessiert bist, selbst wenn mehrere die Bedingung erfüllen sollten? Das liesse sich zwar mittels LIMIT leicht machen - allerdings solltest du dann auch noch eine Sortierung definieren, um reproduzierbare Ergebnisse zu bekommen.
Nein!
Nur ein Datensatz (Record) kann alle Bedingungen erfüllen.
Zum Verständnis:
Ein Recht ist verschiedenen Gruppen zugeordnet, aber nicht unbedingt allen Gruppen.
Wenn man nun ein Recht angibt, ist es einfach alle Gruppen, die diesem Recht zugeordnet sind, auszugeben.
Nun möchte ich das aber andersrum machen. Ich gebe mehrere Gruppen an und möchte das entsprechende Recht haben.
Existiert kein Recht für diese Gruppen, dann erstelle ich ein neues Recht.
Dadurch möchte ich verhindern, dass sowas ensteht:
rightid groupid
1 1
1 2
2 1
2 2
3 1
3 2
Rechte 2 und 3 sind im Prinzip unnötig, da es schon ein Recht mit der rightid 1 gibt, das auf die Gruppen 1 und 2 verweist.
Das Vorhaben lässt sich umsetzen, in dem du mittels IF entscheidest, ob die groupid eine der geforderten ist. Wenn ja, den Wert 1 zurückgeben, wenn nein den Wert -1.
Diese Werte aufsummieren (nach rightid gruppiert), und dann per HAVING nur die Datensätze auswählen, bei denen diese Summe der Anzahl der geforderten groupids entspricht. (Im ersten Beispiel also 2, im zweiten 1.)
Das wäre in der Tat eine denkbare Lösung, jedoch wüsste ich nicht wie ich die realisieren sollte.
Ist das denn nicht einfach mit EXISTS und NOT EXISTS zu lösen?
Nur das dritte Beispiel wird dadurch leicht von der Anforderung abweichend behandelt - du bekommst damit keinen Datensatz mit rightid = NULL zurück, sondern einfach keine Datensätze.
Ja ich meinte auch einfach einen leeren Datensatz!
Gruß Sören