Kreuztabelle oder geht das auch anders?

habak

Benutzer
Beiträge
5
Hallo,

als SQL-Neuling habe ich folgendes Problem.

Ich habe drei Tabellen.
In Tabelle 1 (tab1) sind Benutzer hinterlegt (der Name und die Anzahl an Teilnahmen an Events).
Eine zweite Tabelle (tab2) verwaltet Events (eine fortlaufende Nummer, Eventname und die Teilnehmeranzahl an einem Event).
In der dritten Tabelle (tab3) wird gespeichert, welcher Benutzer an einem Event teilgenommen hat (über die id's) und ob der Event bei der Berechnung der Teilnahmen berücksichtigt (anzeigen =1) werden soll oder nicht (anzeigen=0, der Event noch in der Zukunft liegt).
kreuztab.png

Mit den drei Tabellen möchte ich nun eine Abfrage erstellen, die als Ergebnis die Tabelle 4 (tab4 ) "erzeugt".
Mir ist leider nicht klar, wie ich so etwas anfange.
Für eine Hilfestellung wäre ich sehr dankbar.

Vielen Dank.

Gruß

Habak
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.736
Hallo,

als SQL-Neuling habe ich folgendes Problem.

Mit den drei Tabellen möchte ich nun eine Abfrage erstellen, die als Ergebnis die Tabelle 4 (tab4 ) "erzeugt".

Habak


Diverse Fehler:
  • in Tab1 die Anzahl der Teilnahmen ist aus tab3 berechenbar und damit dort komplett falsch
  • wenn anzeigen vom Datum abhängig ist, an dem das Event ist, dann nutze das Datum, um zu ermitteln, ob es schon war oder erst noch kommt
  • deine Tab4 ist, wenn überhaupt, dann nur mit extremer Mühe machbar. Vergiß die Idee.
 

habak

Benutzer
Beiträge
5
Hallo akretschmer,

Danke für die Erläuterungen zu den scheinbar offensichtlichen Fehler, aber die entsprechenden Felder (Anzahl Teilnahmen und anzeigen) haben im Kontext des gesamten Projekts durchaus ihre Berechtigung. Und ob das datenbankmäßig oder gar performancemäßig nicht optimal ist, erscheint mir als Anfänger zunächst zweitrangig, denn das lässt sich ja später noch anpassen. Zudem führen mehrere Wege nach Rom, denn zukünftige Eventteilnahmen werden in tab3 per Datumsvergleich mit (0) geschrieben und ein tägliches php-Update-Tool prüft nur, ob in tab3 überhaupt "0" vorhanden ist. Natürlich kann ich das auch genau "umdrehen" und die tägliche Abfrage mit der Datumsabfrage durchführen, was aber mehr Trafic erzeugt.
Aber bitte zurück zur eigentlichen Fragestellung.
Nichtsdestotrotz kann ich es als Anfänger (nach jeder Menge Lektüre bezüglich: Achtung normalisieren) kaum glauben,
Diverse Fehler:
  • deine Tab4 ist, wenn überhaupt, dann nur mit extremer Mühe machbar. Vergiß die Idee.
dass zwei Tabellen, die in einer dritten verknüpft sind, nicht wie beschrieben, abgefragt werden können.
Oder wie muss ich die Tabellen dann anlegen?

Danke und Gruß

Habak
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.736
Hallo akretschmer,

Danke für die Erläuterungen zu den scheinbar offensichtlichen Fehler, aber die entsprechenden Felder (Anzahl Teilnahmen und anzeigen) haben im Kontext des gesamten Projekts durchaus ihre Berechtigung. Und ob das datenbankmäßig oder gar performancemäßig nicht optimal ist, erscheint mir als Anfänger zunächst zweitrangig, denn das lässt sich ja später noch anpassen.
Ja, sicher. Ich sehe das täglich in zigfacher Ausführung bei unseren Kunden. Später ist es dann nämlich oft zu spät, das Projekt größer und man kämpft an anderen Fronten. Daß die Ursache in solchen Designfehlern liegt ist dann zwar irgendwie bekannt, aber man kann es nicht mehr ändern.

Zudem führen mehrere Wege nach Rom, denn zukünftige Eventteilnahmen werden in tab3 per Datumsvergleich mit (0) geschrieben und ein tägliches php-Update-Tool prüft nur, ob in tab3 überhaupt "0" vorhanden ist. Natürlich kann ich das auch genau "umdrehen" und die tägliche Abfrage mit der Datumsabfrage durchführen, was aber mehr Trafic erzeugt.

Ja. Dein tägliches Update-Tool, schön via Cronjob, gell? Dumm nur, wenn zur geplanten Zeit Dein Server grad mal down ist, weil der Provider mal Updates macht.

Aber bitte zurück zur eigentlichen Fragestellung.
Nichtsdestotrotz kann ich es als Anfänger (nach jeder Menge Lektüre bezüglich: Achtung normalisieren) kaum glauben,

dass zwei Tabellen, die in einer dritten verknüpft sind, nicht wie beschrieben, abgefragt werden können.
Oder wie muss ich die Tabellen dann anlegen?

Danke und Gruß

Habak

Ich habe Möglichkeiten dafür in den letzten Jahren an einigen Stellen gezeigt, z.B. hier: http://www.pg-forum.de/viewtopic.php?f=66&t=4067. In PostgreSQL gibt es sogar ein extra Contrib-Modul, was sowas relativ elegant kann: http://www.postgresql.org/docs/9.2/interactive/tablefunc.html. Dennoch solltest Du das überdenken. Datenbanken arbeiten mit exakt und fest definierten Tabellen. Dein Ziel ist aber, für jedes Event eine eigene Spalte zu haben. Du kannst es gern versuchen.

Andreas
 
Oben