MySQL-Abfrage-Problem

  • Themenstarter Themenstarter Liposuction
  • Beginndatum Beginndatum
L

Liposuction

Hi,

ich habe eine ziemliches Problem (bin totaler Anfänger). Ich habe von der Schule den Auftrag bekommen einen Bundesligaplaner zu erstellen. Man soll Daten eintragen können, Spieltage anzeigen können und eine Tabelle anzeigen können (diese muss stimmen mit den Ergebnisse die man eingetragen hat).

Mein Problem ist die Tabelle. Ich kriege es einfach nicht, geschweige denn hab ich eine Idee. Hier erstmal meine SQL-Tabellen.

Code:
Create TABLE T_Mannschaften
(
  P_ID TINYINT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  Mannschaftsname  CHAR (30)
)ENGINE=INNODB;

CREATE TABLE T_Spiele
(
  ID INT  PRIMARY KEY NOT NULL AUTO_INCREMENT,
  Datum DATE,
  Spieltag_Nr TINYINT,
  Heim_ID TINYINT,
  CONSTRAINT F_Verbund_1 FOREIGN KEY (Heim_ID) REFERENCES T_Mannschaften (P_ID) ON DELETE CASCADE ON UPDATE CASCADE,
  Auswaerts_ID TINYINT,
  CONSTRAINT F_Verbund_2 FOREIGN KEY (Auswaerts_ID) REFERENCES T_Mannschaften (P_ID) ON DELETE CASCADE ON UPDATE CASCADE,
  Tore_Heim TINYINT,
  Tore_Auswaerts TINYINT,
  Ergebnis TINYINT
)ENGINE=INNODB;

Die Tabellen sind gefüllt mit z.B. folgenden Werten:

Code:
INSERT INTO T_Mannschaften (Mannschaftsname)
VALUES
('TSG 1899 Hoffenheim'),
('FC Bayern München'),
('Hertha BSC Berlin'),
('Hamburger SV'),
('Bayer 04 Leverkusen'),
('Borussia Dortmund'),
('FC Schalke 04'),
('SV Werder Bremen'),
('VFL Wolfsburg'),
('VFB Stuttgart'),
('1.FC Köln'),
('Eintracht Frankfurt'),
('Hannover 96'),
('Arminia Bielefeld'),
('Karlsruher SC'),
('FC Energie Cottbus'),
('VFL Bochum 1848'),
('Borussia Mönchengladbach');


INSERT INTO T_Spiele (Datum, Spieltag_Nr, Heim_ID, Auswaerts_ID)
VALUES
('2009-01-30',18,4,2),
('2009-01-31',18,13,7),
('2009-01-31',18,11,9),
('2009-01-31',18,6,5),
('2009-01-31',18,3,12),
('2009-01-31',18,1,16),
('2009-01-31',18,10,18),
('2009-02-01',18,8,14),
('2009-02-01',18,17,15),


Daten abfragen tue ich wie folgt:

PHP:
<?

//Dort sind alle Daten zum Connecten auf die DB drinne.
include("db.php");


//Übergabe der Variablen aus der Formularseite
$Nr= $_POST["Spieltag_Nr"];

include("bundesliga2.html");

//SQL-Befehl zum Abfragen der Daten in die Tabelle t_spiele
$result = mysql_query("SELECT ID, Datum, Spieltag_Nr, M1.Mannschaftsname AS Heimmannschaft, 
M2.Mannschaftsname AS Auswaertsmannschaft, Tore_Heim, Tore_Auswaerts
FROM (t_spiele AS S INNER JOIN t_mannschaften AS M1 ON S.Heim_ID = M1.P_ID) INNER JOIN 
t_mannschaften AS M2 ON S.Auswaerts_ID = M2.P_ID
WHERE Spieltag_Nr = $Nr
ORDER BY ID");




echo '<center>';
echo '<table border="1">';
echo '<tr><th>ID</th><th>Datum</th><th>Spieltag</th><th>Spielansetzung</th><th>Spielergebnis</th></tr>';


//Daten aus der Datenbank holen, solange bis die Bedingung des Spieltages nicht mehr erfüllt ist
while($row = mysql_fetch_array($result))
{
echo '<tr>';
echo '<th>'.$row["ID"].'</th>';
echo '<th>'.$row["Datum"].'</th>';
echo '<th>'.$row["Spieltag_Nr"].'</th>';
echo '<th>'.$row["Heimmannschaft"] ." : " .$row["Auswaertsmannschaft"].'</th>';
echo '<th>'.$row["Tore_Heim"] .":" .$row["Tore_Auswaerts"].'</th>';
echo '</tr>';
}
echo '</table>';
echo '</center>';

//Datenbank wieder schliessen
mysql_close();


?>


So gebe ich Daten ein:
PHP:
<?

include("db.php");

//Übergabe der Variablen aus der Formularseite.
//DIe Variablen heißen in dem HTML-Dokument genauso wie hier.
$ToreH= $_POST["Tore_Heim"];
$ToreA= $_POST["Tore_Auswaerts"];
$ID = $_POST["ID"];

//SQL-Befehl zum Updaten der Baten in die Tabelle t_spiele.
$eintrag = "UPDATE t_spiele SET Tore_Heim=$ToreH, Tore_Auswaerts=$ToreA WHERE ID=$ID";

///Nun erfolgt der Eintrag in die Tabelle.
$eintragen = mysql_query($eintrag);

//Datenbank wieder schliessen.
mysql_close();

//Folgende Anweisungen rufen die Formularseite wieder auf, 
//um weitere Daten eingeben zukönnen.

Header('Location: bundesliga1.html');

?>

Meine Frage ist, wie kriege ich eine Live-Tabelle hin? Es müssen die Ergebnisse verglichen werden, bei einem Sieg +3 Punkte, bei Unentschieden +1 Punkt, bei Niederlage 0 Punkte.

Hab schon probiert, alle Daten in ein Array zu packen und dann mit Hilfe von Ifelse die Daten zu filtern. War ein gnadenloses scheitern. Kann ich überhaupt mit php sowas machen?

Ich danke schonmal für Hilfe bzw. Tipps.

EDIT: Hab gerade nochmal nachgedacht. Wäre es besser in die 2. Tabelle noch ein Attirbut einzufügen wie Ergebnis, wo dann drinne steht 1 für Sieg 2 für unentschieden usw.?
 
Zuletzt bearbeitet von einem Moderator:
Genau vor diesem Problem stand ich letztes Jahr auch. Ich musste für unsere Liga ein komplettes Verwaltungsscript programmieren. Damals war ich auch noch blutiger Anfänger. Dank diesem Forum hier hab ich enorm viel dazu gelernt.

EDIT: Hab gerade nochmal nachgedacht. Wäre es besser in die 2. Tabelle noch ein Attirbut einzufügen wie Ergebnis, wo dann drinne steht 1 für Sieg 2 für unentschieden usw.?

genau so hab ich es auch gelöst.
Hier mal ein auschnitt aus meiner Tabelle Spielplan wo ich die Tabelle errechne:
Code:
CREATE TABLE IF NOT EXISTS `spielplan` (
  `id` int(10) NOT NULL auto_increment,
  `spieltagNr` int(5) NOT NULL default '0',
  `spielnr` int(5) NOT NULL default '0',
  `heim` int(2) NOT NULL default '0',
  `gast` int(2) NOT NULL default '0',
  `spieltag` varchar(100) NOT NULL default '',
  `liga_id` int(2) NOT NULL default '0',
  `datum` date NOT NULL default '0000-00-00',
  `verschoben` date NOT NULL default '0000-00-00',
  `entry` int(1) NOT NULL default '0',
  `heimpunkte` int(2) NOT NULL default '0',
  `gastpunkte` int(2) NOT NULL default '0',
  `heimspiele` int(2) NOT NULL default '0',
  `gastspiele` int(2) NOT NULL default '0',
  `einspruch` text NOT NULL,
  `gewertet` int(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2821 ;
kannst dir ja mal ansehen:

http://www.schwaben-liga.de
 
Okay, ich habe jetze noch ein Ergebnis-Feld eingefügt. Problem ist, ich weiß nicht wie die Abfrage lauten soll.

SELECT MAX(Spieltag_Nr) AS Spieltag FROM t_spiele AS S, t_mannschaften AS M
WHERE Tore_Heim IS NOT NULL AND Tore_Auswaerts IS NOT NULL
GROUP BY hier sollten die Mannschaften stehen");

Vll kann mir da noch jmd helfen.
 
ICh zeig Dir hier jetzt noch die Datenbankabfrage welche ich verwendet habe. Wenn Du diese mit meiner Tabelle vergleichst, dann wirste selbst drauf kommen :)

PHP:
$db->query("SELECT
	t.teamname,
	@heimpunkte := (SELECT sum(s.heimpunkte) FROM spielplan s WHERE s.heim = t.id $aktiv GROUP BY t.id LIMIT 1) heimpunkte,
	@gastpunkte := (SELECT sum(s.gastpunkte) FROM spielplan s WHERE s.gast = t.id $aktiv GROUP BY t.id LIMIT 1) gastpunkte,
	@heimgegen := (SELECT sum(s.heimpunkte) FROM spielplan s WHERE s.gast = t.id $aktiv GROUP BY t.id LIMIT 1) heimgegen,
	@gastgegen := (SELECT sum(s.gastpunkte) FROM spielplan s WHERE s.heim = t.id $aktiv GROUP BY t.id LIMIT 1) gastgegen,
	@heimspiele := (SELECT sum(s.heimspiele) FROM spielplan s WHERE s.heim = t.id $aktiv GROUP BY t.id LIMIT 1) heimspiele,
	@gastspiele := (SELECT sum(s.gastspiele) FROM spielplan s WHERE s.gast = t.id $aktiv GROUP BY t.id LIMIT 1) gastspiele,
	@heimgegenspiele := (SELECT sum(s.heimspiele) FROM spielplan s WHERE s.gast = t.id $aktiv GROUP BY t.id LIMIT 1) heimgegenspiele,
	@gastgegenspiele := (SELECT sum(s.gastspiele) FROM spielplan s WHERE heim = t.id $aktiv GROUP BY t.id LIMIT 1) gastgegenspiele,
	@spiele_all := (@heimspiele + @gastspiele) spiele_all,
	@gegen_all := (@heimgegenspiele + @gastgegenspiele) gegen_all,
	@spiele_diff := (@spiele_all - @gegen_all) spiele_diff,
	@heim_all := (@heimpunkte + @gastpunkte) heim_all,
	@gast_all := (@heimgegen + @gastgegen) gast_all,
	@punkte_diff := (@heim_all - @gast_all) punkte_diff,
	@tuniere := (SELECT count(s.id) FROM spielplan s WHERE s.gast=t.id AND s.entry=1 OR s.heim=t.id AND s.entry=1 $aktiv GROUP BY t.id LIMIT 1) tuniere
FROM
	teams t
WHERE
	t.liga_id=$liga $aktiv 
GROUP BY
	t.id
ORDER BY
	punkte_diff DESC,
	tuniere ASC,
	spiele_diff DESC");
 
So, jetzt habe ich ein anderes Problem. Ich kann nicht nach den Punkten sortieren, eigentlich nach gar nichts?!

PHP:
<?

//Dort sind alle Daten zum Connecten auf die DB drinne.
include("db.php");


//Übergabe der Variablen aus der Formularseite
$Nr= $_POST["Tabelle"];

include("bundesliga3.html");

//SQL-Befehl zum Abfragen 


$result = mysql_query("SELECT t.Mannschaftsname AS Mannschaft, 

(SELECT sum(s.Heimpunkte)
FROM t_spiele s
WHERE s.Heim_ID = t.P_ID
GROUP BY t.P_ID
LIMIT 1
) AS Heimpunkte, 

(SELECT sum( s.Auswaertspunkte )
FROM t_spiele s
WHERE s.Auswaerts_ID = t.P_ID
GROUP BY t.P_ID
LIMIT 1
) AS Auswaertspunkte,

(SELECT sum( s.Tore_Heim )
FROM t_spiele s
WHERE s.Heim_ID = t.P_ID
GROUP BY t.P_ID
LIMIT 1
) AS Heimtore, 

(SELECT sum( s.Tore_Auswaerts )
FROM t_spiele s
WHERE s.Auswaerts_ID = t.P_ID
GROUP BY t.P_ID
LIMIT 1
) AS Auswaertstore,

(SELECT max(Spieltag_Nr)
FROM t_spiele s
WHERE s.Auswaerts_ID = t.P_ID
AND Heimpunkte = 0 OR Auswaertspunkte=0
GROUP BY t.P_ID
LIMIT 1
) as Spieltag,


(SELECT SUM(Heimtore+Auswaertstore)) AS Tore,


(SELECT SUM(Heimpunkte+Auswaertspunkte)) AS Punkte

FROM t_mannschaften t
GROUP BY t.P_ID
ORDER BY Punkte DESC --> hier ist das Problem



");





echo '<center>';
echo '<table border="1">';
echo '<tr><th>Platz</th><th>Mannschaft</th><th>Spieltag</th><th>Tore</th><th>Punkte</th></tr>';

$num="1";
while($row = mysql_fetch_array($result))
{
echo '<th>'.$num.'</th>';
echo '<th>'.$row["Mannschaft"].'</th>';
echo '<th>'.$row["Spieltag"].'</th>';
echo '<th>'.$row["Tore"].'</th>';
echo '<th>'.$row["Punkte"].'</th>';
echo '</tr>';
$num++;
}



//Daten aus der Datenbank holen

echo '</table>';
echo '</center>';




//Datenbank wieder schliessen
mysql_close();


?>
 
versuch es mal so:

PHP:
$query ="SELECT t.Mannschaftsname AS Mannschaft,
@Heimpunkte      := (SELECT sum(s.Heimpunkte)FROM t_spiele s WHERE s.Heim_ID = t.P_ID GROUP BY t.P_ID LIMIT 1) Heimpunkte,
@Auswaertspunkte := (SELECT sum(s.Auswaertspunkte) FROM t_spiele s WHERE s.Auswaerts_ID = t.P_ID GROUP BY t.P_ID LIMIT 1) Auswaertspunkte,
@Heimtore        := (SELECT sum(s.Tore_Heim) FROM t_spiele s WHERE s.Heim_ID = t.P_ID GROUP BY t.P_ID LIMIT 1) Heimtore,
@Auswaertstore   := (SELECT sum(s.Tore_Auswaerts) FROM t_spiele s WHERE s.Auswaerts_ID = t.P_ID GROUP BY t.P_ID LIMIT 1) Auswaertstore,
@Spieltag        := (SELECT max(s.Spieltag_Nr) FROM t_spiele s WHERE s.Auswaerts_ID = t.P_ID AND Heimpunkte = 0 OR Auswaertspunkte=0 GROUP BY t.P_ID LIMIT 1) Spieltag,
@Tore            := (SELECT SUM(Heimtore+Auswaertstore)) Tore,
@Punkte          := (SELECT SUM(Heimpunkte+Auswaertspunkte)) Punkte
FROM t_mannschaften t
GROUP BY t.P_ID
ORDER BY Punkte DESC ";
// MySQL - Anweisung mit Fehlerausgabe
$result = mysql_query($query) or die("Fehler: ".mysql_error());

Und den Query zum debuggen immer mit Error ausgeben lassen bis es passt.
Bin mir nämlich nicht ganz sicher ob die Tabellenstruktur welche Du noch im ersten Post hast mit deiner jetzigen übereinstimmt.
 
Zurück