Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Sportrangliste realisieren.... [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Sportrangliste realisieren....


 
quirnov
27-04-2002, 13:09 
 
Hallo!

Ich möchte per mysql und php eine Fußballtabelle realisieren.

Nun fängt es schon (für mich als Anfänger) beim schwierigen Datenbankdesign an.

Folgende Überlegungen habe ich (nach Hilfestellung einiger Fachleute) gemacht:

3. Tabellen mit folgenden Feldern:
1.
mannschaften
| ms_id
| ms_name
2.
spieltage
| st_id
| st_tagnr

3.
spiel
| sp_id
| sp_spieltag_id (identisch mit der st_tagnr)
| sp_datum
| sp_heim_id (identisch mit ms_id)
| sp_gast_id (identisch mit ms_id)
| sp_tore_heim
| sp_tore_gast
| sp_punkte_heim
| sp_punkte_gast

Was meint ihr dazu - wäre das ein gutes DB-Design? oder was kann/sollte man ändern?

Aus diesen Tabellen soll dann per Select eben eine Tabelle erstellt werden - die ungefähr so aussieht:

Platz Mannschaft Tore Punkte
1. FS Krücke 4:3 3
.
.
.
.

Schon mal vielen Dank für eure Hilfe

Gruß

quirinov

 
hand
28-04-2002, 13:53 
 
Voll in Ordnung
Ich würde sp_spieltag_id (identisch mit der st_id) verknüpfen.

Vielleicht noch Anzahl Zuseher?
Anzahl Rote, Gelbe Karten?
Bemerkung: "Absage aufgrund Mitsumi" ?
....

 
Troublegum
28-04-2002, 14:22 
 
Original geschrieben von hand
Bemerkung: "Absage aufgrund Mitsumi" ?
....

In Gedanken schon bei der WM ? :D
Aber ein Mitsumi wirds wohl kaum geben, hoffe ich doch mal..

 
quirnov
28-04-2002, 14:27 
 
Vielen Dank für Deine Hilfe!

Könntest Du mir vielleicht auch weiter helfen - wenn es um die entsprechenden SQL-Abfragen geht... Bisher hab ich hinbekommen - jeweils die Tore und Punkte zusammen zu zählen - die eine Mannschaft erziehlt/bekommen hat - egal ob sie daheim oder auswärts gespielt hat... jetzt hätte ich aber auch noch gern die Gegentore mit einbezogen... wie kann ich das machen - dass ich die zusammenzähle (also von Heim- und Auswärtsspielen) und dann eben wie in ner Fußballtabelle ausgebe:

Tore
3:4

Wobei die vordere Zahl hab ich ja bereits - nur die hintere - das funktioniert noch nicht - die Abfrage dazu - krieg ich auch noch hin... ist eben genau umgekehrt - wie die vorherige... aber wie kann ich das dann darstellen... mein problem: ich sortiere ja die erste tabelle nach den punkten und toren... das bringt dann das problem mit sich - dass ich die zweite abfrage nicht danach sortieren kann - schließlich sind da ja andere punkte und tore... wie in der ersten...

Danke schon mal!

 
Troublegum
28-04-2002, 14:29 
 
Hast du mal ein Beispiel Dump mit Beispiel Daten für micn ?
Dann schau ich mal.

 
quirnov
28-04-2002, 14:33 
 
Was meinst du denn mit DUMP?? Immer diese Fachausdrücke :-)

Bin noch absoluter Neuling - deshalb verstehe ich nicht alles auf Anhieb....

 
Troublegum
28-04-2002, 14:43 
 
Ein Dump ist ein Backup einer Datenbank.
Damit ich die Tabellen nicht selbst erstellen muss und Daten einfügen muss. Aber lass mal, ich hab die Tabellen schon nach obiger Struktur erstellt.

 
quirnov
28-04-2002, 14:48 
 
Danke!

Hätte auch garnicht gewusst - wie ich so ein DUMP mache.... kannst du mir ja vielleicht auch mal sagen...

dann bin ich wieder etwas schlauer...

ich hab mir darüber schon die ganze zeit den kopf zerbrochen und überlegt - ob da ne temporäre tabelle helfen könnte - aber das hab ich nicht hingekriegt...

 
Troublegum
28-04-2002, 15:09 
 
So, folgende Abfrage liefert dir eine Tabelle
mit ms_id,ms_name,Punkte der Mannschaft, Tore der Mannschaft, Gegentore der Mannschaft.

SELECT ms.ms_id,ms.ms_name,
IF(sp.sp_heim_id=ms.ms_id,SUM(sp.sp_punkte_heim),SUM(sp.sp_punkte_gast)) as ms_punkte,
IF(sp.sp_heim_id=ms.ms_id,SUM(sp.sp_tore_heim),SUM(sp.sp_tore_gast)) as ms_tore,
IF(sp.sp_heim_id=ms.ms_id,SUM(sp.sp_tore_gast),SUM(sp.sp_tore_heim)) as ms_gtore
FROM mannschaften ms
LEFT JOIN spiel sp ON (sp.sp_heim_id=ms.ms_id OR sp.sp_gast_id=ms.ms_id)
GROUP BY ms.ms_id ORDER BY ms_punkte DESC,ms_tore DESC,ms_gtore ASC;

Um es zu testen, habe ich mal 2 Spieltage erstellt:
1) Deutschland - England (0:2) | 3 Punkte für England
2) Brasilien - Deutschland (3:3) | je 1 Punkt für beide Ms

Also kommt heraus bei der Tabelle:
+-------+-------------+-----------+---------+----------+
| ms_id | ms_name | ms_punkte | ms_tore | ms_gtore |
+-------+-------------+-----------+---------+----------+
| 2 | England | 3 | 2 | 0 |
| 3 | Brasilien | 1 | 3 | 3 |
| 1 | Deutschland | 1 | 3 | 5 |
+-------+-------------+-----------+---------+----------+

Brasilien liegt aufgrund des besseren Torverhältnisses vorne.

Ein Dump der Tabelle zum Nachvollziehen (mit phpmyadmin ausführen)

Datenbank test auf localhost
# phpMyAdmin MySQL-Dump
# version 2.2.6-rc1
# http://phpwizard.net/phpMyAdmin/
# http://phpmyadmin.sourceforge.net/ (download page)
#
# Host: localhost
# Erstellungszeit: 28. April 2002 um 15:09
# Server Version: 3.23.49
# PHP-Version: 4.1.2
# Datenbank : `test`
# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `mannschaften`
#

CREATE TABLE mannschaften (
ms_id mediumint(5) unsigned NOT NULL auto_increment,
ms_name varchar(120) NOT NULL default '',
PRIMARY KEY (ms_id)
) TYPE=MyISAM;

#
# Daten für Tabelle `mannschaften`
#

INSERT INTO mannschaften VALUES (1, 'Deutschland');
INSERT INTO mannschaften VALUES (2, 'England');
INSERT INTO mannschaften VALUES (3, 'Brasilien');
# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `spiel`
#

CREATE TABLE spiel (
sp_id mediumint(5) unsigned NOT NULL auto_increment,
sp_spieltag_id mediumint(5) unsigned NOT NULL default '0',
sp_datum datetime NOT NULL default '0000-00-00 00:00:00',
sp_heim_id mediumint(5) unsigned NOT NULL default '0',
sp_gast_id mediumint(5) unsigned NOT NULL default '0',
sp_tore_heim tinyint(3) unsigned NOT NULL default '0',
sp_tore_gast tinyint(3) unsigned NOT NULL default '0',
sp_punkte_heim tinyint(1) unsigned NOT NULL default '0',
sp_punkte_gast tinyint(1) NOT NULL default '0',
PRIMARY KEY (sp_id)
) TYPE=MyISAM;

#
# Daten für Tabelle `spiel`
#

INSERT INTO spiel VALUES (1, 1, '2002-04-27 14:43:06', 1, 2, 0, 2, 0, 3);
INSERT INTO spiel VALUES (2, 2, '2002-04-28 14:43:46', 3, 1, 3, 3, 1, 1);
# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `spieltage`
#

CREATE TABLE spieltage (
st_id mediumint(5) unsigned NOT NULL auto_increment,
st_tagnr mediumint(5) unsigned NOT NULL default '0',
PRIMARY KEY (st_id)
) TYPE=MyISAM;

#
# Daten für Tabelle `spieltage`
#

INSERT INTO spieltage VALUES (1, 1);
INSERT INTO spieltage VALUES (2, 2);

 
quirnov
28-04-2002, 15:16 
 
Vielen Dank!

Wußte garnicht - dass ich da auch if einbauen kann... das war wohl mein größtes Problem...

Kannst Du mir vielleicht ein gutes Buch zu mysql empfehlen - mit dem man von Anfang an lernen kann....

wäre nett!

Danke nochmals!

 
quirnov
28-04-2002, 15:36 
 
Hallo!

Ich habe das natürlich jetzt gleich ausprobiert - alles so übernommen - wie du es vorgeben hast - nur andere Daten eingegeben...

Folgenden DUMP Struktur mit Inhalt hab ich:

# phpMyAdmin MySQL-Dump
# version 2.2.6
# http://phpwizard.net/phpMyAdmin/
# http://www.phpmyadmin.net/ (download page)
#
# Host: localhost
# Erstellungszeit: 28. April 2002 um 15:34
# Server Version: 3.23.44
# PHP-Version: 4.0.6
# Datenbank : `test`
# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `mannschaften`
#

CREATE TABLE mannschaften (
ms_id mediumint(5) unsigned NOT NULL auto_increment,
ms_name varchar(120) NOT NULL default '',
PRIMARY KEY (ms_id)
) TYPE=MyISAM;

#
# Daten für Tabelle `mannschaften`
#

INSERT INTO mannschaften VALUES (1, 'SG Parr');
INSERT INTO mannschaften VALUES (2, 'SV Habkirchen');
INSERT INTO mannschaften VALUES (3, 'SF Walsheim');
INSERT INTO mannschaften VALUES (4, 'SV Gersheim');
# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `spiel`
#

CREATE TABLE spiel (
sp_id mediumint(5) unsigned NOT NULL auto_increment,
sp_spieltag_id mediumint(5) unsigned NOT NULL default '0',
sp_datum datetime NOT NULL default '0000-00-00 00:00:00',
sp_heim_id mediumint(5) unsigned NOT NULL default '0',
sp_gast_id mediumint(5) unsigned NOT NULL default '0',
sp_tore_heim tinyint(3) unsigned NOT NULL default '0',
sp_tore_gast tinyint(3) unsigned NOT NULL default '0',
sp_punkte_heim tinyint(1) unsigned NOT NULL default '0',
sp_punkte_gast tinyint(1) NOT NULL default '0',
PRIMARY KEY (sp_id)
) TYPE=MyISAM;

#
# Daten für Tabelle `spiel`
#

INSERT INTO spiel VALUES (1, 1, '2002-04-28 15:25:34', 1, 2, 1, 0, 3, 0);
INSERT INTO spiel VALUES (2, 1, '2002-04-28 15:26:17', 3, 4, 1, 0, 3, 0);
INSERT INTO spiel VALUES (3, 2, '2002-04-28 15:26:45', 2, 3, 2, 0, 3, 0);
INSERT INTO spiel VALUES (4, 2, '2002-04-28 15:27:12', 4, 1, 2, 3, 0, 3);
INSERT INTO spiel VALUES (5, 3, '2002-04-28 15:27:40', 1, 3, 1, 1, 1, 1);
INSERT INTO spiel VALUES (6, 3, '2002-04-28 15:28:35', 2, 4, 3, 0, 3, 0);
# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `spieltage`
#

CREATE TABLE spieltage (
st_id mediumint(5) unsigned NOT NULL auto_increment,
st_tagnr mediumint(5) unsigned NOT NULL default '0',
PRIMARY KEY (st_id)
) TYPE=MyISAM;

#
# Daten für Tabelle `spieltage`
#

INSERT INTO spieltage VALUES (1, 1);
INSERT INTO spieltage VALUES (2, 2);
INSERT INTO spieltage VALUES (3, 3);


Mit Deiner Abfrage taucht jetzt nur ein Fehler auf... SG Parr müsste eigentlich 7 Punkte haben - hat aber nur 4 - ich habe schon versucht den Fehler ausfindig zu machen - aber leider nix gefunden...

Vielleicht kannst Du mir ja nochmal helfen!

Danke schon mal!

 
quirnov
28-04-2002, 15:39 
 
Hallo!

Ich habe das natürlich jetzt gleich ausprobiert - alles so übernommen - wie du es vorgeben hast - nur andere Daten eingegeben...

Folgenden DUMP Struktur mit Inhalt hab ich:

# phpMyAdmin MySQL-Dump
# version 2.2.6
# http://phpwizard.net/phpMyAdmin/
# http://www.phpmyadmin.net/ (download page)
#
# Host: localhost
# Erstellungszeit: 28. April 2002 um 15:34
# Server Version: 3.23.44
# PHP-Version: 4.0.6
# Datenbank : `test`
# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `mannschaften`
#

CREATE TABLE mannschaften (
ms_id mediumint(5) unsigned NOT NULL auto_increment,
ms_name varchar(120) NOT NULL default '',
PRIMARY KEY (ms_id)
) TYPE=MyISAM;

#
# Daten für Tabelle `mannschaften`
#

INSERT INTO mannschaften VALUES (1, 'SG Parr');
INSERT INTO mannschaften VALUES (2, 'SV Habkirchen');
INSERT INTO mannschaften VALUES (3, 'SF Walsheim');
INSERT INTO mannschaften VALUES (4, 'SV Gersheim');
# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `spiel`
#

CREATE TABLE spiel (
sp_id mediumint(5) unsigned NOT NULL auto_increment,
sp_spieltag_id mediumint(5) unsigned NOT NULL default '0',
sp_datum datetime NOT NULL default '0000-00-00 00:00:00',
sp_heim_id mediumint(5) unsigned NOT NULL default '0',
sp_gast_id mediumint(5) unsigned NOT NULL default '0',
sp_tore_heim tinyint(3) unsigned NOT NULL default '0',
sp_tore_gast tinyint(3) unsigned NOT NULL default '0',
sp_punkte_heim tinyint(1) unsigned NOT NULL default '0',
sp_punkte_gast tinyint(1) NOT NULL default '0',
PRIMARY KEY (sp_id)
) TYPE=MyISAM;

#
# Daten für Tabelle `spiel`
#

INSERT INTO spiel VALUES (1, 1, '2002-04-28 15:25:34', 1, 2, 1, 0, 3, 0);
INSERT INTO spiel VALUES (2, 1, '2002-04-28 15:26:17', 3, 4, 1, 0, 3, 0);
INSERT INTO spiel VALUES (3, 2, '2002-04-28 15:26:45', 2, 3, 2, 0, 3, 0);
INSERT INTO spiel VALUES (4, 2, '2002-04-28 15:27:12', 4, 1, 2, 3, 0, 3);
INSERT INTO spiel VALUES (5, 3, '2002-04-28 15:27:40', 1, 3, 1, 1, 1, 1);
INSERT INTO spiel VALUES (6, 3, '2002-04-28 15:28:35', 2, 4, 3, 0, 3, 0);
# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `spieltage`
#

CREATE TABLE spieltage (
st_id mediumint(5) unsigned NOT NULL auto_increment,
st_tagnr mediumint(5) unsigned NOT NULL default '0',
PRIMARY KEY (st_id)
) TYPE=MyISAM;

#
# Daten für Tabelle `spieltage`
#

INSERT INTO spieltage VALUES (1, 1);
INSERT INTO spieltage VALUES (2, 2);
INSERT INTO spieltage VALUES (3, 3);


Mit Deiner Abfrage taucht jetzt nur ein Fehler auf... SG Parr müsste eigentlich 7 Punkte haben - hat aber nur 4 - ich habe schon versucht den Fehler ausfindig zu machen - aber leider nix gefunden... liegt wohl daran - dass ms_name irgendwie alphabetisch sortiert wird... Ist nämlich genau umgekehrt - Walsheim hat die Punktzahl von SG Parr und SG Parr die von Walsheim.... Aber wo liegt der Fehler???

Vielleicht kannst Du mir ja nochmal helfen!

Danke schon mal!

 
Troublegum
28-04-2002, 16:18 
 
Hallo,

tut mir Leid, ich hatte die Abfrage nur mit meinem Beispiel probiert. Ich werde das mal dein Beispiel überprüfen.

sorry

 
quirnov
28-04-2002, 16:27 
 
Hallo!

Macht ja nix...

weiß immer noch nicht woran es liegt - aber wie gesagt - der sortiert ms_name alphabetisch - kann natürlich auch rein zufällig sein...

noch ne möglichkeit wäre - dass da irgendwas beim zusammenzählen der punkte falsch läuft... wegen heim bzw. gast recht...

wenn ich die Punkte aus allen auswärtsspielen haben will muss das doch heißen sp_gast_id = ms_id - dann habe ich da die punkte und die mit sp_tore_gast die erzielten tore bzw. dann mit sp_tore_heim die gegentore... vielleicht läuft da irgendwas schief... bin mir aber nicht sicher...

 
Troublegum
28-04-2002, 16:37 
 
Also an der Sortierung liegt es nicht.
Das liegt an der Zählung.. nochmal ausprobieren.

Ich kann im Moment auch nur ausprobieren. So der Profi bin ich auch nicht. Aber ich häng mich mal dahinter.

 
quirnov
28-04-2002, 16:44 
 
Ok - ich probiere auch die ganze Zeit rum - aber irgendwie kommt dabei nix passendes raus...

 
quirnov
28-04-2002, 18:06 
 
Hallo!

Wenn ich mir das so recht überlege... dann stimmt etwas nicht im Aufbau:

wenn ms_id = sp_heim_id dann nehmen wir die sp_tore_heim und die sp_punkte_heim zu diesen toren und punkten sollen die tore und punkte gezählt werden - wenn ms_id = sp_heim_id - da nehmen wir dann die sp_tore_gast und sp_punkte_gast

im gegenzug soll für für gegentore dann stehen

bei ms_id = sp_heim_id sp_tore_gast dazu dazugezählt bei ms_id = sp_gast_id sp_tore_heim und dann hätten wir die gegentore...

Aber wie kriegt man das hin??? Wer weiß das??? Ich probiere da rum - aber es funktioniert einfach nicht...

Schon mal vielen Dank!!!

 
Troublegum
28-04-2002, 18:11 
 
Das Problem bei der Abfrage liegt beim JOIN.

Ich kann problemlos Punkte, Tore usw. zählen, die die Teams zuHause und auswärts gesammelt haben. Aber getrennt mit 2 Queries, in einer schaff ichs auch nicht... :(

 
quirnov
28-04-2002, 18:18 
 
ja soweit bin ich auch - aber ich komme auch nicht weiter - wenn es darum geht - irgendwie die gegentore mit in ne tabelle zu kriegen - also per php auszugeben von wegen 9:4 - das gibt dann ärger - weil ich die geschossenen tore und punkte - tabelle schon sortiert habe - und ich kann dann die gegentor-tabelle nicht danach sortieren... dann kommt die summe der gegentore beim falschen verein an... man müsste - denk ich mal - alles irgendwie in ne temporäre tabelle zwischenspeichern...

dann könnte man da vielleicht irgendwie weiter dran rum basteln.. und dann eben die endtabelle per php ausgeben... aber wie das funktionieren soll... keinen blassen schimmer... du viellicht???

danke schon mal...

 
Troublegum
28-04-2002, 18:21 
 
Ja, mit php ist das nicht so schwer.
Ich bin nur enttäuscht, dass ich es nicht mit einer einzigen Query hinbekomme :(

 
quirnov
28-04-2002, 18:28 
 
und wie würde das dann in php aussehen? ich krieg das nämlich nicht hin - dass dann eben ne tabelle wie z. b. die ausgeben wird:

platz mannschaft tore tordifferenz punkte spiele
1 sg parr 4:3 1 3 2


und dann so weiter...

kannst du mir dabei helfen???

danke schon mal

 
Troublegum
28-04-2002, 19:43 
 
Teste mal die angehängte Datei.
Ich weiß allerdings nicht, wie man diese Liste nach Punkten und Toren/Gegentoren sortiert.
Das ist halt mit SQL am einfachsten.

 
quirnov
28-04-2002, 19:51 
 
Hallo!

Danke für Deine Hilfe - mittlerweile hab ich ne andere Lösung gefunden... ich habe das Datenbankdesign etwas anders gemacht....

Jetzt ist es leichter - die Informationen rauszufiltern...

Hab Dir die Datei mal angehängt falls Dich das interessiert... DUMP (ohne Daten) und die einzelnen Abfragen sind drin...

Nochmals Danke für Deine Mühe!

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:25 Uhr.