1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

dynamische Abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Quest, 27 Januar 2020.

  1. Quest

    Quest Neuer Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ja, vielleicht. Da wir nicht wissen, was genau Du Dir da ausgedacht hast, bleibt die Antwort vage ...
     
  3. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    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 ^^
     
    akretschmer gefällt das.
  4. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    k, muss zugeben, mein code funkt iwie nicht nach testen ^^

    aber ich denke, für die Abfrage würden JOINS reichen.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Prinzipiell hatte ich auch an einen TRIGGER gedacht, geprüft habe ich den Code von @Kampfgummibaerlie nicht.
     
  6. Quest

    Quest Neuer Benutzer

    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?
    = Tabelle Teilnehmer Max

    Ist es jetzt etwas klarer geworden was genau ich meine?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  8. Quest

    Quest Neuer Benutzer

    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.
     
  9. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden