MYSQL und PHP Updatebefehl

bcmIT

Cadet 4th Year
Registriert
Sep. 2012
Beiträge
111
Hallo Zusammen

Ich lerne momentan SQL und PHP, dazu Arbeite ich gerade an einer Webseite, in welcher man Ergebnisse einer Sport Veranstaltung eintragen kann, mit Teilnehmern und Disziplinen...

Nun, momentan habe ich ein Table mit den Atributen ID_Startnummer, und ID_Disziplin ( als Fremd-, wie auch Primärschlüssel) Resultat1(mit den erreichten Punkten) und ein Atribut Rang(in welchem momentan 0 steht).

Nun möchte ich mit dem SQL Befehl:
Code:
Select Disziplin_ID,Startnummer_ID,Resultat1,Rang 
From Teilnehmer,Disziplin,Ergebnis
Where ID_Startnummer=Startnummer_ID and ID_Disziplin=Disziplin_ID order by Resultat1 DESC;
die Tabellen durchsuchen und den Datensätzen den entsprechenden Rang einfügen. (1. Zeile==> Rang=1 ...2.Zeile==> Rang=2...usw).

Wie kann ich die tun?

Hier ist noch der gesammte MYSQL Code:
Code:
CREATE DATABASE RANGLISTE;
USE RANGLISTE;

#Tabelen erstellen

CREATE TABLE VEREIN(
ID_Verein INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,VereinName VARCHAR(30) NOT NULL 
);


CREATE TABLE GESCHLECHT(
ID_Geschlecht INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,Geschlecht VARCHAR(1)
);

CREATE TABLE TEILNEHMER(
ID_Startnummer INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,Vorname VARCHAR(30)  NOT NULL 
,Name VARCHAR (30)  NOT NULL 
,Geschlecht_ID INT  NOT NULL 
,Verein_ID INT  NOT NULL 
,FOREIGN KEY (Geschlecht_ID) REFERENCES GESCHLECHT (ID_Geschlecht)  ON DELETE CASCADE
,FOREIGN KEY (Verein_ID) REFERENCES VEREIN (ID_Verein)  ON DELETE CASCADE
);

CREATE TABLE ERGEBNIS(
               Startnummer_ID INT NOT NULL REFERENCES TEILNEHMER(ID_Startnummer)  ON DELETE CASCADE,
               Disziplin_ID INT NOT NULL REFERENCES DISZIPLIN(ID_Disziplin)  ON DELETE CASCADE,
               Resultat1 INT  NOT NULL ,
               Resultat2 INT,
               Resultat3 INT,
			   Rang INT,
               PRIMARY KEY (Startnummer_ID,Disziplin_ID)
);


ALTER TABLE ERGEBNIS
ADD CONSTRAINT FOREIGN KEY (Startnummer_ID) REFERENCES TEILNEHMER (ID_Startnummer)  ON DELETE CASCADE;

CREATE TABLE DISZIPLIN(
ID_Disziplin INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,DisziplinName VARCHAR(30)  NOT NULL 
,Masseinheit1 VARCHAR (20) NOT NULL
,Masseinheit2 VARCHAR (20)
,Masseinheit3 VARCHAR (20)
,Bewertungskriterium VARCHAR(30)  NOT NULL
);

#Danten einfügen
INSERT INTO GESCHLECHT
VALUES (NULL, "m")
,(NULL, "w");

Update Ergebnis
Set Rang=2
Where ID_Startnummer=Startnummer_ID and ID_Disziplin=Disziplin_ID order by Resultat1 DESC;

Select Disziplin_ID,Startnummer_ID,Resultat1,Rang 
From Teilnehmer,Disziplin,Ergebnis
Where ID_Startnummer=Startnummer_ID and ID_Disziplin=Disziplin_ID order by Resultat1 DESC;

Vielen Dank
 
Hi bcmIT,

ehrlich gesagt verstehe ich die Frage nicht ganz, aber aus meiner Sicht macht es auch keinerlei Sinn den Rang in der Tabelle zu speichern, da du ihn bei jeder Änderung irgendwelcher Ergebnisse neu berechnen und dann jedes mal alle Zeilen ändern musst.

Wäre es nicht viel einfacher den Rang einfach in deiner PHP-Ausgabe mit anzuzeigen? Also beispielweise eine Tabelle, in der du die richtig sortierten Ergebnisse anzeigst und dann noch zusätzlich eine Spalte "Rang", die nichts weiter als eine fortlaufende Zahl ist?

Damit ersparst du dir aus meiner Sicht jede Menge unnötige Berechnungen und Arbeit und das Ergebnis ist vermutlich das gleiche.

Gruß bandit600
 
Nun, du kannst entweder ganz primitiv mit mysql_connect(...) ne Verbindung aufbauen, mit mysql_query(...) deine Abfrage durchführen und z.B. mit mysql_ fetch_ assoc(...) über dein Ergebnis iterieren, oder aber du machst gleich Nägel mit Köpfen, ignorierst diese veraltete (und vor allem UNSICHERE Notation) und verwendest PDO's, die im Endeffekt, wenn richtig verwendet:
- viel sicherer sind
- stabiler und schneller laufen
- deinen PHP-Code von der gewählten Datenbank entkoppeln, du könntest z.B. auch auf PostgreSQL, SQLite oder MSSQL setzen.

Also: Lern keinen alten Mist, lern neues gutes Zeug. Lern die objektorientierte Notation mit Prepared Statements.
 
@Hancock ok versuch ich mal. Danke
@Daaron vielen Dank für deinen Tipp.. wusste nicht das es so etwas gibt :P
 
Tja... Leider wissen viele so etwas nicht. Aber das wird sich "bald" erledigen. Mit einer der nächsten PHP-Versionen wir die alte Notation endgültig geschlachtet, denn sie macht es dem Programmierer einfach viel zu einfach, sehr schlechten Code zu schreiben, der für SQL Injections hochgradig anfällig ist.
Hätten die Idioten bei Sony damals Prepared Statements verwendet, dann wären sie nicht so total billig gehackt worden und hätten nicht einige Millionen Dollar eingebüßt.
 
Zurück
Oben