dynamische Abfrage

Quest

Neuer Benutzer
Beiträge
3
Hallo zusammen,

ich möchte gerne eine Eventverwaltung schreiben. Dazu kann man Eventarten erstellen. Diese Eventarten werden dann zu Grunde gelegt bei der Terminerstellung wo nun eine Maximale Teilnehmerzahl / Eventart eingetragen werden soll. Es können je Termin unterschiedliche Eventarten mit unterschiedlichen Maximalen Teilnehmerzahlen eingetragen werden. Die Teilnehmer stehen in einer Liste und sind einem bestimmten Eventart zugeordnet.

Die Tabellen:
Eventart: Eventkürzel, Eventname,ID
Teilnehmer: Anmeldedatum,Name,Vorname,EventID,ID
Termine: Eventdatum,Eventuhrzeit,(Teilnehmermax EventID x,Teilnehmermax EventID y),ID

Jetzt möchte ich einen SELECT Aufruf mit dem ich automatisiert die maximal möglichen Teilnehmer der Veranstalltung zuordnen:
SELECT * FROM Teilnehmer WHERE EventID='x' ORDER BY Anmeldedatum LIMIT Teilnehmermax Event x
Mein Problem ist nun wie ich die dynamik hinbekomme damit ich einmal die Eventarten für jeden Termin und die Maximaleteilnehmerzahl für jede Eventart ausgelesen und verarbeitet bekomme. Habe schon über eine weitere Tabelle nach gedacht. Wäre das vielleicht die Lösung?
 
Werbung:
Ich verwende PostgreSQL, sollte aber, falls möglich, ähnlich funktionieren:

(Ich erstelle neue Datenbank usw):
1.: Datenbank erstellen
Code:
create database events;

2.: Tabelle Events erstellen
Code:
create table events(id serial primary key, name text unique not null, Eventkürzel text not null);

3.: Tabelle Teilnehmer erstellen
Code:
create table teilnehmer(id serial primary key, anmeldedatum date default now()::date, vorname text not null, name text not null);

4.: Tabelle Termine erstellen
Code:
create table termine(id serial primary key, max_teilnehmer integer check(max_teilnehmer >= 0), eventdatum date not null, eventuhrzeit time not null);

5.: Tabelle Terminteilnehmer erstellen (mir fallt derzeit nichts anderes ein, habe so eine ähnliche Situation gelöst bei einer World of Warcraft Raid Planner Datenbank)
Code:
create table terminteilnehmer(id serial primary key, eventtermin integer references termine(id), teilnehmer integer references teilnehmer(id));

6.: Trigger-Procedure bezüglich der Tabelle Terminteilnehmer:
Code:
create or replace function max_teilnehmer_check() returns trigger as $$
begin
if count(terminteilnehmer.id) <= termine.max_teilnehmer
from terminteilnehmer inner join termine on (eventtermin = termine.id) where eventtermin = termine.id
group by termine.id
then
return new;
else
raise exception 'sorry, bereits ausreichend angemeldet!';
end if;
end;
$$ language plpgsql;

7.: Den Trigger für Tabelle Terminteilnehmer anlegen:
Code:
create trigger max_teilnehmer_check before insert on terminteilnehmer for each row execute procedure max_teilnehmer_check();

Testen:

8.: Den Event Kaffeetratsch eintragen ;)
Code:
insert into events(name, eventkürzel) values ('Kaffeetratsch', 'K-T');

9.: Den Teilnehmer "VI P" eintragen
Code:
insert into teilnehmer(vorname, name) values ('VI', 'P');

10.: Den Termin Kaffeetratsch eintragen
Code:
insert into termine(max_teilnehmer, eventdatum, eventuhrzeit) values (0, now()::date, now()::time);

11.: Es sollte kein einziger zu dem Termin eintragbar sein, weil max_teilnehmer bei 0 liegt.
Code:
insert into terminteilnehmer(eventtermin, teilnehmer) values (
(select id from termine limit 1),
(select id from teilnehmer limit 1));

ERROR: sorry, bereits ausreichend angemeldet!

ANMKERUNG: PostgreSQL und so...

Problem gelöst(?)
bei weiteren Fragen, frag ruhig ^^
 
Also in der Tabelle Termine sollen für mehrere Eventarten die jeweiligen Maxteilnehmer angegeben werden. Hatte hier über ein Json Feld nachgedacht um die Daten mit Mysql verarbeiten zu können. Dafür fehlt mir aber auch die Erfahrung. Eine andere Alternative die mir in den Gedanken gekommen ist, wäre wenn eine neue Eventart erstellt wird, in der Tabelle Termine für die Eventart eine neue Teilnehmer Max Spalte einzufügen. Finde ich aber eher unglücklich. Die nächste Alternative wäre halt eine neue Tabelle in der ich die Teilnehmer Max für den jeweiligen Termin und die jeweilige Eventart abspeicher.

Tabelle Teilnehmer Max: EventID(int200),TerminID(int200),Maxint(2),ID(Int200 unsigned autoincredement primary)

Dann soll jetzt geguckt werden welche Eventarten beim Termin eingetragen wurden und wieviele Teilnehmer je Eventart möglich sind. Die Tabelle Teilnehmer Max Inforamtionen wollte ich zuerst in der Tabelle Termine als string gespeichert werden... Nur wie lese ich die dann dynamisch wieder aus um die Limit und Where Clause zu bedienen? BZw. wie könnte ich das mit der Tabelle Eventarten umsetzen? Müsste das ja entweder mit PHP in einer While Schleife extern erledigen oder geht das mit dem Beispiel von Kampfgummibärlie auch?
(Teilnehmermax EventID x,Teilnehmermax EventID y)
= Tabelle Teilnehmer Max

Ist es jetzt etwas klarer geworden was genau ich meine?
 
Nur wie lese ich die dann dynamisch wieder aus um die Limit und Where Clause zu bedienen?

Wozu?

Einfaches Modell:

Code:
test=# create table eventart(id serial primary key, name text);
CREATE TABLE
test=*# create table teilnehmer (id serial primary key, name text);
CREATE TABLE
test=*# create table termine (id serial primary key, event int references eventart, tn_max int);
CREATE TABLE
test=*# create table termine_teilnehmer (termin int references termine, teilnehmer int references teilnehmer, primary key(termin,teilnehmer));
CREATE TABLE
test=*#

Auf die letzte Tabelle ein TRIGGER, der bei Eintragungen prüft, of für den Termin die Anzahl der Records in dieser Tabelle noch kleiner/gleich dem tn_max aus der Termintabelle ist.
 
Hallo zusammen,

entschuldigt das ich mich erst jetzt wieder melde. Hatte bis jetzt keine Zeit. Das Problem ist, dass ich eine SELECT Abfrage brauche. Mit einem Insert kriege ich das was ich machen will leider nicht umgesetzt. Und auf ein Select kann ich ja keinen trigger setzen. Also wird es wohl doch auf eine PHP Lösung hinauslaufen.
 
Werbung:
Kurze Zusammenfassung meinerseits:

1.: Trigger arbeiten ständig mit, wie sie programmiert werden (on insert, update, etc.)
2.: Limit gilt nur bei Abfragen, wenn man ein Limit für Eventanmeldungen einprogrammieren will, mittels eines Triggers.

Sprich, du solltest dich nicht hinter eine Abfrage zwingen, sondern hinter die Datenbankgestaltung.
War am Anfang auch mein Problem, weil ich einrichten wollte, dass eine gewisse maximale Anzahl an Maschinen gemietet werden können.

Ich wiederum habe keine Erfahrung mit MySQL ;)

Hatte am Anfang auch ehrlich gesagt Angst davor, einen Trigger einzubauen, aber glaube mir, mit solchen ist viel möglich.
 
Zurück
Oben