Hallo,
ich stehe hier vor einem riesen Problem, dass ich alleine nicht gelöst bekomme und nun Hilfe und Anregungen von Profis suche.
Ich bin gerade dabei, in PHP eine Rankingliste für Statistiken zu erstellen und habe sie für Turniere, Ligen und Ladder in jeweils einer Tabelle gespeichert.
Screenshot: http://www.templatebar.de/share/2012-07-13_1329.png
Die Auswertung jeweils einer Tabelle ist soweit kein Problem wie man oben im Screen sehen kann. Nur die Auswertung aus allen 3 Tabellen (Turniere und Ligen und Ladder) zusammen, also inkl. Such- und Sortierfunktion bekomme ich so nicht hin. Die Ausgabe ist dann nicht anderes als wie auf dem Screenshot zu sehen ist. Halt nur aus allen 3 Tabellen und nicht nur aus einer.
Hier mal die Tabellenstrukturen aller Tabellen, die involviert sind:
Turnier Stats:
[highlight=sql]
CREATE TABLE `turnier_stats` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
`team` int(10) NOT NULL,
`turnier` int(10) NOT NULL,
`group` int(10) NOT NULL,
`spiele` int(10) NOT NULL,
`tore` int(10) NOT NULL,
`gtore` int(10) NOT NULL,
`punkte` int(10) NOT NULL,
`siege` int(10) NOT NULL,
`unentschieden` int(10) NOT NULL,
`niederlagen` int(10) NOT NULL,
`differenz` int(10) NOT NULL,
PRIMARY KEY (`id`)
)
[/highlight]
Ligen Stats:
[highlight=sql]
CREATE TABLE `ligen_stats` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
`team` int(10) NOT NULL,
`liga` int(10) NOT NULL,
`group` int(10) NOT NULL,
`spiele` int(10) NOT NULL,
`tore` int(10) NOT NULL,
`gtore` int(10) NOT NULL,
`punkte` int(10) NOT NULL,
`siege` int(10) NOT NULL,
`unentschieden` int(10) NOT NULL,
`niederlagen` int(10) NOT NULL,
`differenz` int(10) NOT NULL,
PRIMARY KEY (`id`)
)
[/highlight]
Ladder Stats:
[highlight=sql]
CREATE TABLE `ladder_stats` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
`team` int(10) NOT NULL,
`ladder` int(10) NOT NULL,
`group` int(10) NOT NULL,
`spiele` int(10) NOT NULL,
`tore` int(10) NOT NULL,
`gtore` int(10) NOT NULL,
`punkte` int(10) NOT NULL,
`siege` int(10) NOT NULL,
`unentschieden` int(10) NOT NULL,
`niederlagen` int(10) NOT NULL,
`differenz` int(10) NOT NULL,
PRIMARY KEY (`id`)
)
[/highlight]
Teams für die Suche nach dem Teamname. Die Team ID wird in der Statistiktabelle im Feld `team` eingetragen
[highlight=sql]
CREATE TABLE `teams` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
[/highlight]
User für die Suche nach dem Username. Die User ID wird in der Statistiktabelle im Feld `user_id` eingetragen
[highlight=sql]
CREATE TABLE `users` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`nick` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
[/highlight]
Es soll also möglich sein, nach Teamnamen oder Usernamen suchen zu können, sowie die Sortierung anhand folgender Werte:
Spielmodus (steht in der Tabelle z.Bsp. `turnier` im Feld `stats`)
Plattform (steht in der Tabelle z.Bsp. `turnier` im Feld `portal`)
Zeitraum (steht in der Tabelle z.Bsp. `turnier` im Feld `datum` (Timestamp))
Hier mal was ich bis jetzt gemacht habe:
[highlight=sql]
SELECT s1.`id`, s2.`team`, (s2.`tpoints` + s3.`lpoints` + s4.`lapoints`) AS `allpoints`, (s2.`tgames` + s3.`lgames` + s4.`lagames`) AS `allgames`
FROM `users` AS s1
LEFT JOIN (
SELECT `stats`, `portal`, `datum` FROM `turniere` (Wenn Sortierung aktiv, dann setzte ich per PHP folgende Werte ein: WHERE s2.`stats` = '1' AND `portal` = 'pc' AND s2.`datum` >= '".$season_start."' AND s2.`datum` <= '".$season_stop."')
) AS s2 ON s1.`id` = s2.`user_id`
LEFT JOIN (
SELECT `user_id`, `team`, SUM(`punkte`) AS `tpoints`, SUM(`spiele`) AS `tgames` FROM `turnier_stats` GROUP BY `user_id`, `team`
) AS s2 ON s1.`id` = s2.`user_id`
LEFT JOIN (
SELECT `user_id`, `team`, SUM(`punkte`) AS `lpoints`, SUM(`spiele`) AS `lgames` FROM `ligen_stats` GROUP BY `user_id`, `team`
) AS s3 ON s1.`id` = s3.`user_id`
LEFT JOIN (
SELECT `user_id`, `team`, SUM(`points`) AS `lapoints`, SUM(`spiele`) AS `lagames` FROM `ladder_stats` GROUP BY `user_id`, `team`
) AS s4 ON s1.`id` = s4.`user_id`
GROUP BY s1.`id`, s2.`team`
ORDER BY `allpoints` DESC, `allgames`, s1.`id`
[/highlight]
Meine Abfrage nur für nur Turniere oder Ligen oder Ladden habe ich bereits fertig und funktioniert mit folgendem Code:
Beispiel Turnierstatistik
[highlight=sql]
SELECT sum(s1.`punkte`) AS points, s1.`turnier`, s1.`user_id`, s1.`team`, s2.`stats`, s2.`datum`, s3.`nick`, s4.`name`, s4.`id` AS `team_id`
FROM ".$sql_prefix."turnier_stats AS s1 LEFT JOIN ".$sql_prefix."turniere AS s2 ON s1.`turnier` = s2.`id`
LEFT JOIN ".$db['users']." AS s3 ON s1.`user_id` = s3.`id`
LEFT JOIN ".$sql_prefix."teams AS s4 ON s1.`team` = s4.`id`
".$rwhere.$r2where." ".$group_by."
ORDER BY `points` DESC, s1.`spiele`, s1.`user_id`
LIMIT ".($page - 1)*$mranking.",".$mranking."
[/highlight]
Mit den Variablen $rwhere setzte ich, sofern im Formular ausgewählt wird folgendes ein:
[highlight=sql]
WHERE s2.`stats` = '".$_SESSION['modus']."' AND s2.`portal` = '".$_SESSION['plattform']."' AND s2.`datum` >= '".$season_start."' AND s2.`datum` <= '".$season_stop."'
[/highlight]
Mit der Variable $r2where setzte ich, sofern jemand nach einem Namen sucht folgendes ein:
[highlight=sql]
AND (s3.`nick` LIKE '%".$_SESSION['searchuser']."%' OR s4.`name` LIKE '%".$_SESSION['searchuser']."%')
[/highlight]
Und die $group_by Variable dann jeweils mit
[highlight=sql]
GROUP BY GROUP BY s1.team
[/highlight]
sofern nur Team Stats angezeigt werden sollen und
[highlight=sql]
GROUP BY GROUP BY s1.user_id
[/highlight]
wenn nur User Stats angezeigt werden sollen.
Wie gesagt, dass alles funktioniert breits jeweils für meine Turnier, Ligen und Ladder Statistiken. Jetzt möchte ich aber eine Liste, wo alles zusammen ist.
Ich hoffe, dass sich mir jemand hier erbarmt und mir helfen kann.
Vielen Dank im Voraus.
ich stehe hier vor einem riesen Problem, dass ich alleine nicht gelöst bekomme und nun Hilfe und Anregungen von Profis suche.
Ich bin gerade dabei, in PHP eine Rankingliste für Statistiken zu erstellen und habe sie für Turniere, Ligen und Ladder in jeweils einer Tabelle gespeichert.
Screenshot: http://www.templatebar.de/share/2012-07-13_1329.png
Die Auswertung jeweils einer Tabelle ist soweit kein Problem wie man oben im Screen sehen kann. Nur die Auswertung aus allen 3 Tabellen (Turniere und Ligen und Ladder) zusammen, also inkl. Such- und Sortierfunktion bekomme ich so nicht hin. Die Ausgabe ist dann nicht anderes als wie auf dem Screenshot zu sehen ist. Halt nur aus allen 3 Tabellen und nicht nur aus einer.
Hier mal die Tabellenstrukturen aller Tabellen, die involviert sind:
Turnier Stats:
[highlight=sql]
CREATE TABLE `turnier_stats` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
`team` int(10) NOT NULL,
`turnier` int(10) NOT NULL,
`group` int(10) NOT NULL,
`spiele` int(10) NOT NULL,
`tore` int(10) NOT NULL,
`gtore` int(10) NOT NULL,
`punkte` int(10) NOT NULL,
`siege` int(10) NOT NULL,
`unentschieden` int(10) NOT NULL,
`niederlagen` int(10) NOT NULL,
`differenz` int(10) NOT NULL,
PRIMARY KEY (`id`)
)
[/highlight]
Ligen Stats:
[highlight=sql]
CREATE TABLE `ligen_stats` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
`team` int(10) NOT NULL,
`liga` int(10) NOT NULL,
`group` int(10) NOT NULL,
`spiele` int(10) NOT NULL,
`tore` int(10) NOT NULL,
`gtore` int(10) NOT NULL,
`punkte` int(10) NOT NULL,
`siege` int(10) NOT NULL,
`unentschieden` int(10) NOT NULL,
`niederlagen` int(10) NOT NULL,
`differenz` int(10) NOT NULL,
PRIMARY KEY (`id`)
)
[/highlight]
Ladder Stats:
[highlight=sql]
CREATE TABLE `ladder_stats` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
`team` int(10) NOT NULL,
`ladder` int(10) NOT NULL,
`group` int(10) NOT NULL,
`spiele` int(10) NOT NULL,
`tore` int(10) NOT NULL,
`gtore` int(10) NOT NULL,
`punkte` int(10) NOT NULL,
`siege` int(10) NOT NULL,
`unentschieden` int(10) NOT NULL,
`niederlagen` int(10) NOT NULL,
`differenz` int(10) NOT NULL,
PRIMARY KEY (`id`)
)
[/highlight]
Teams für die Suche nach dem Teamname. Die Team ID wird in der Statistiktabelle im Feld `team` eingetragen
[highlight=sql]
CREATE TABLE `teams` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
[/highlight]
User für die Suche nach dem Username. Die User ID wird in der Statistiktabelle im Feld `user_id` eingetragen
[highlight=sql]
CREATE TABLE `users` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`nick` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
[/highlight]
Es soll also möglich sein, nach Teamnamen oder Usernamen suchen zu können, sowie die Sortierung anhand folgender Werte:
Spielmodus (steht in der Tabelle z.Bsp. `turnier` im Feld `stats`)
Plattform (steht in der Tabelle z.Bsp. `turnier` im Feld `portal`)
Zeitraum (steht in der Tabelle z.Bsp. `turnier` im Feld `datum` (Timestamp))
Hier mal was ich bis jetzt gemacht habe:
[highlight=sql]
SELECT s1.`id`, s2.`team`, (s2.`tpoints` + s3.`lpoints` + s4.`lapoints`) AS `allpoints`, (s2.`tgames` + s3.`lgames` + s4.`lagames`) AS `allgames`
FROM `users` AS s1
LEFT JOIN (
SELECT `stats`, `portal`, `datum` FROM `turniere` (Wenn Sortierung aktiv, dann setzte ich per PHP folgende Werte ein: WHERE s2.`stats` = '1' AND `portal` = 'pc' AND s2.`datum` >= '".$season_start."' AND s2.`datum` <= '".$season_stop."')
) AS s2 ON s1.`id` = s2.`user_id`
LEFT JOIN (
SELECT `user_id`, `team`, SUM(`punkte`) AS `tpoints`, SUM(`spiele`) AS `tgames` FROM `turnier_stats` GROUP BY `user_id`, `team`
) AS s2 ON s1.`id` = s2.`user_id`
LEFT JOIN (
SELECT `user_id`, `team`, SUM(`punkte`) AS `lpoints`, SUM(`spiele`) AS `lgames` FROM `ligen_stats` GROUP BY `user_id`, `team`
) AS s3 ON s1.`id` = s3.`user_id`
LEFT JOIN (
SELECT `user_id`, `team`, SUM(`points`) AS `lapoints`, SUM(`spiele`) AS `lagames` FROM `ladder_stats` GROUP BY `user_id`, `team`
) AS s4 ON s1.`id` = s4.`user_id`
GROUP BY s1.`id`, s2.`team`
ORDER BY `allpoints` DESC, `allgames`, s1.`id`
[/highlight]
Meine Abfrage nur für nur Turniere oder Ligen oder Ladden habe ich bereits fertig und funktioniert mit folgendem Code:
Beispiel Turnierstatistik
[highlight=sql]
SELECT sum(s1.`punkte`) AS points, s1.`turnier`, s1.`user_id`, s1.`team`, s2.`stats`, s2.`datum`, s3.`nick`, s4.`name`, s4.`id` AS `team_id`
FROM ".$sql_prefix."turnier_stats AS s1 LEFT JOIN ".$sql_prefix."turniere AS s2 ON s1.`turnier` = s2.`id`
LEFT JOIN ".$db['users']." AS s3 ON s1.`user_id` = s3.`id`
LEFT JOIN ".$sql_prefix."teams AS s4 ON s1.`team` = s4.`id`
".$rwhere.$r2where." ".$group_by."
ORDER BY `points` DESC, s1.`spiele`, s1.`user_id`
LIMIT ".($page - 1)*$mranking.",".$mranking."
[/highlight]
Mit den Variablen $rwhere setzte ich, sofern im Formular ausgewählt wird folgendes ein:
[highlight=sql]
WHERE s2.`stats` = '".$_SESSION['modus']."' AND s2.`portal` = '".$_SESSION['plattform']."' AND s2.`datum` >= '".$season_start."' AND s2.`datum` <= '".$season_stop."'
[/highlight]
Mit der Variable $r2where setzte ich, sofern jemand nach einem Namen sucht folgendes ein:
[highlight=sql]
AND (s3.`nick` LIKE '%".$_SESSION['searchuser']."%' OR s4.`name` LIKE '%".$_SESSION['searchuser']."%')
[/highlight]
Und die $group_by Variable dann jeweils mit
[highlight=sql]
GROUP BY GROUP BY s1.team
[/highlight]
sofern nur Team Stats angezeigt werden sollen und
[highlight=sql]
GROUP BY GROUP BY s1.user_id
[/highlight]
wenn nur User Stats angezeigt werden sollen.
Wie gesagt, dass alles funktioniert breits jeweils für meine Turnier, Ligen und Ladder Statistiken. Jetzt möchte ich aber eine Liste, wo alles zusammen ist.
Ich hoffe, dass sich mir jemand hier erbarmt und mir helfen kann.
Vielen Dank im Voraus.
Comment