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

Mysql Abfrage mit count

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von thyl123, 19 Januar 2013.

  1. thyl123

    thyl123 Neuer Benutzer

    Hallo zusammen,

    ich habe eine Datenbank die daten heißt. In dieser befinden sich Anmeldedaten für ein Turnier. Jetzt möchte ich, dass das Anmeldeformular bei einer bestimmten Anzahl (200) abbricht und einen Nachricht rausgibt: Anmeldung nicht mehr möglich - ausgebucht.

    kann mir da jemand helfen?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Du kannst das auf verschiedenen Wegen testen:

    • Deine Applikation überwacht das, indem z.B. vor dem Insert geprüft wird, wie viele aktuell drin sind
    • Du schreibst einen TRIGGER, der bei INSERT das innerhalb der DB prüft

    Die TRIGGER-Lösung hätte den Charme, daß diese unabhängig von Client ist und auch noch bei vielen gleichzeitigen Verbindungen sicher funktioniert.


    Andreas
     
  3. akretschmer

    akretschmer Datenbank-Guru


    Für Leute, die PostgreSQL (folgendes geht NICHT mit MySQL!) verwenden und eine Lösung suchen, hier mal diese Spielerei:

    Code:
    test=# create table anmeldungen(id int primary key, name text, check(id between 1 and 5));
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "anmeldungen_pkey" for table "anmeldungen"
    CREATE TABLE
    Time: 3,916 ms
    test=*# insert into anmeldungen(id) select s from generate_series(1,5)s;
    INSERT 0 5
    Time: 0,544 ms
    
    jetzt haben wir eine Tabelle, die in der ID-Spalte Werte von 1-5 akzeptiert und die Spalte ist damit gefüllt. Das Feld NAME ist leer.

    Nun folgendes:

    Code:
    test=*# with x as (select min(id) as id from anmeldungen where name is null) update anmeldungen set name = 'ich' from x where anmeldungen.id = x.id returning x.id;                                                                                                                                                               
    id                                                                                                                                                             
    ----                                                                                                                                                             
      1                                                                                                                                                             
    (1 row)                                                                                                                                                         
     
    UPDATE 1
    Time: 0,570 ms
    test=*# with x as (select min(id) as id from anmeldungen where name is null) update anmeldungen set name = 'du' from x where anmeldungen.id = x.id returning x.id;                                                                                                                                                                 
    id                                                                                                                                                             
    ----                                                                                                                                                             
      2                                                                                                                                                             
    (1 row)                                                                                                                                                         
     
    UPDATE 1
    Time: 0,473 ms
    test=*# with x as (select min(id) as id from anmeldungen where name is null) update anmeldungen set name = 'name3' from x where anmeldungen.id = x.id returning x.id;                                                                                                                                                             
    id                                                                                                                                                             
    ----                                                                                                                                                             
      3                                                                                                                                                             
    (1 row)                                                                                                                                                         
     
    UPDATE 1
    Time: 0,478 ms
    test=*# with x as (select min(id) as id from anmeldungen where name is null) update anmeldungen set name = 'name4' from x where anmeldungen.id = x.id returning x.id;                                                                                                                                                             
    id                                                                                                                                                             
    ----                                                                                                                                                           
      4                                                                                                                                                             
    (1 row)                                                                                                                                                         
     
    UPDATE 1
    Time: 0,466 ms
    test=*# with x as (select min(id) as id from anmeldungen where name is null) update anmeldungen set name = 'name5' from x where anmeldungen.id = x.id returning x.id;
    id
    ----
      5
    (1 row)
     
    UPDATE 1
    Time: 0,472 ms
    test=*# with x as (select min(id) as id from anmeldungen where name is null) update anmeldungen set name = 'name6' from x where anmeldungen.id = x.id returning x.id;
    id
    ----
    (0 rows)
     
    UPDATE 0
    Time: 0,419 ms
    test=*# with x as (select min(id) as id from anmeldungen where name is null) update anmeldungen set name = 'name7' from x where anmeldungen.id = x.id returning x.id;
    id
    ----
    (0 rows)
     
    UPDATE 0
    Time: 0,419 ms
    test=*# select * from anmeldungen ;
    id | name
    ----+-------
      1 | ich
      2 | du
      3 | name3
      4 | name4
      5 | name5
    (5 rows)
     
    Time: 0,166 ms
    test=*#
    
    Wie man sieht: man kann mit dem Befehl alle Werte setzen. Gelingt dies (bis name5), bekommt man die ID als Returnwert. Sind alle 'Slots' belegt, bekommt man kein Returnwert - das ganze ist also gescheitert. Die Applikation braucht nur zu schauen, ob eine ID zurückkommt (Erfolg) oder eben Nix, dann ist die Liste eben voll.

    Anstatt der Prüfung 'where name is null' könnte man natürlich auch z.B. ein BOOLsches Flag auswerten, ob die Buchung gültig ist oder so.


    Andreas
     
  4. ukulele

    ukulele Datenbank-Guru

    Ich würde sagen das ist alleine Sache des Anmeldeformulares und würde keinen Trigger verwenden. Es sei denn, die maximale Teilnehmer Zahl ist auch sauber in der DB abgebildet. Nur dann macht ein Trigger sinn. Allerdings muss auch dann das Anmeldeformular die Fehlermeldung der DB sinnvoll interpretieren!
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Da hier, also in einem DB-Forum, gefragt wurde, gehe ich davon aus, daß der Fragesteller eine DB-basierte Lösung suchte ;-)

    Natürlich kann man Constraint-Checks auch in der Applikation machen, das ist sogar sinnvoll. Aber die Möglichkeiten einer DB auszunutzen hat eben den Charme, daß z.B. bei einem neuen Client-Programm nicht alle Prüfungen wieder eingebaut werden müssen, was ja irgendwo auch fehleranfällig ist.


    Andreas
     
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