Mysql Abfrage mit count

thyl123

Neuer Benutzer
Beiträge
1
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?
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
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?

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
 

akretschmer

Datenbank-Guru
Beiträge
9.028
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


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
 

ukulele

Datenbank-Guru
Beiträge
4.394
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!
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
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!

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
 
Oben