SELECT empty_tbl.x, ... FROM empty_tbl, ...
Christian
- datenbank
0 Sven Rautenberg0 Christian0 Ilja
'n Abend allerseits,
Hintergrund (nicht unbedingt problemrelevant):
Es geht um ein Mitteilungssystem.
Dem Benutzer soll in seinem "Archiv" seine verfassten Mitteilungen angezeigt bekommen.
Dabei soll angezeigt werden, an wen er die jeweilige Mitteilung geschickt hat.
Es gibt verschiedene Empfänger-Gruppen, die in verschiedenen Datenbanktabellen gespeichert sind.
Wenn man die Menge aller Empfänger betrachtet, sind bestehen IDs mehrfach.
In der Mitteilungstabelle ist deswegen Empfänger-Gruppe und Empfänger-ID gespeichert, womit eine eindeutige Zuweisung möglich ist.
Ich habe nun folgendes Problem:
Eine MySQL-Abfrage der Art "SELECT x.a, x.b, x.c, Empfaenger-Gruppe1.a, Empfaenger-Gruppe2.a, Empfaenger-Gruppe3.b FROM x, Empfaenger-Gruppe1, Empfaenger-Gruppe2, Empfaenger-Gruppe3" wählt keine Datensätze aus, wenn beispielsweise Empfaenger-Gruppe2 eine leere Tabelle ist.
Ich bin mir dabei sicher, dass in diesem Fall in der WHERE-Klausel diese Tabelle auch nicht betrachtet wird.
Wenn ich die leere Tabelle aus der Abfrage lösche, funktioniert es wie gewünscht.
Es passiert aber schon mal, dass eine Empfänger-Gruppe leer ist.
Kann man einen Ausdruck in die Abfrage hinzufügen, dass MySQL sich nicht an der leeren Tabelle stört?
Oder gibt's eine Abfrage wie is_empty?(Empfaenger-Gruppe1 || Empfaenger-Gruppe2 || Empfaenger-Gruppe3) -> {true, false} oder muss ich da was anderes mit PHP basteln, damit er eine Anfrage ohne die entsprechende Empfaenger-Gruppe macht, falls diese leer ist?
Letzteres würde recht viel Aufwand bedeuten, für etwas, was nur sehr selten vorkommt.
Da wäre es vielleicht sogar besser, immer zu sehen, dass irgendein inhaltsloser Eintrag immer in den Empfaenger-Gruppen-Tabellen bestehen bleibt...
Viele Grüße
Christian
Moin!
Es gibt verschiedene Empfänger-Gruppen, die in verschiedenen Datenbanktabellen gespeichert sind.
Das ist das Grundübel deines Problems.
Vereine alle Empfängergruppen auf EINE Tabelle. Füge eine weitere Spalte "Empfängergruppe" hinzu, in der die zugehörige Empfängergruppe steht. Das funktioniert prima, wenn jeder Empfänger nur in EINER Gruppe stehen kann.
Alternativ legst du eine weitere Tabelle mit den Empfängergruppen an, die im Prinzip nur ein paar Verwaltungsinformationen für die Nutzer enthalten müssen (Bezeichnung, Rechte etc.), sowie unbedingt eine Gruppen-ID.
Dazu legst du noch eine weitere Tabelle mit den zwei Spalten "Gruppen-ID" und "Benutzer-ID" an, und in die schreibst du rein, welcher Benutzer (eindeutige ID) in welchen Gruppen vorhanden ist.
Wenn man die Menge aller Empfänger betrachtet, sind bestehen IDs mehrfach.
Das ist nur noch ein Nebenproblem bei der Neuzuordnung.
- Sven Rautenberg
Hi Sven,
Vereine alle Empfängergruppen auf EINE Tabelle.
Das Mitteilungssystem ist nur so ein Nebending des ganzen Systems, ein Modul, was ich im Nachhinein ergänze.
Die Tabellen der Empfängergruppen sind sehr unterschiedlich aufgebaut, an einem Empfänger hängen sehr viele verschiedene Informationen dran, jede Empfängergruppe dient anderen Prozessen zu anderen Zwecken.
Bei den verschiedenen Empfängergruppen handelt es sich nicht einmal immer um Personen.
Eine Vereinigung der Tabellen nur wegen des Mitteilungssystems wäre ganz sicherlich keine gute Idee. Da würde ich fast meine ganze Datenbank in eine Tabelle schreiben.
Viele Grüße
Christian
Kann man einen Ausdruck in die Abfrage hinzufügen, dass MySQL sich nicht an der leeren Tabelle stört?
Nach ausgiebigerer Archiv-Suche vermute ich, dass LEFT JOIN mir helfen könnte... mal gucken, ob ich das versteh...
yo,
Kann man einen Ausdruck in die Abfrage hinzufügen, dass MySQL sich nicht an der leeren Tabelle stört?
jein, wie du bereits selbst herausgefunden hast, geht das mit einem OUTER JOIN. was mir aber fehlt, das sind die beziehungen der einzelnen tabellen, schließlich steht ja nicht jeder datensatz mit jedem anderen datensatz in verbindung.
eventuell wäre der UNION operator der bessere weg für dich, um die tabellen aus den verschiedenen tabellen abzufragen. auch eine leere tabelle wäre damit kein problem.
Ilja