php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.06.2011, 22:15  
Neuer Benutzer
 
Registriert seit: 22.06.2011
Beiträge: 9
PHP-Kenntnisse:
Anfänger
douse29 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von lstegelitz Beitrag anzeigen
Gruppenbruch revers:

anzahl = 1
X = aktueller Spieltag Ergebnis (Sieg/Niederlage)

Solange davorliegender Spieltag Ergebnis == X
: anzahl ++

letzte Serie : anzahl "X" (z.b. 4 Siege)

Du kannst an jeder Stelle der Liste einsteigen (z.B. um einen all-time-record festzustellen)
Erstmal Danke, das hat mich schon etwas weitergebracht.
Allerdings bin ich mit meiner Lösung noch nicht wirklich glücklich, kann man das nicht noch optimieren ? Und ist es vielleicht möglich alle Vereine in einem SELECT abzufragen, nicht jeden Verein (team) einzeln ?

Code:
SET @anzahl=0;
SELECT IF(Sieg=1, @anzahl:=@anzahl+1, @anzahl:=0) AS Serie FROM (
    SELECT e.datum, t.teamname, m.tore_heim, m.tore_gast,
        IF(m.team_heim_id = t.team_id, 
          IF(m.tore_heim > m.tore_gast, 1, 0), 
          IF(m.tore_heim < m.tore_gast, 1, 0)
       ) AS Sieg
    FROM teams t 
    INNER JOIN matches m ON (m.team_heim_id = t.team_id OR m.team_gast_id = t.team_id) 
    JOIN eintraege e ON e.eintrags_id = m.eintrags_id 
    WHERE t.team_id = 12
    ORDER BY e.datum DESC
    ) AS temp
ich sortiere hier nach datum, das könnte man aber auch durch e.spieltag ersetzen.
douse29 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 23.06.2011, 23:22  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Ermittle die Anzahl der Siege, die NACH der letzten Niederlage (Subselect, Sortierung nach Datum, nur Niederlagen des Teams, nur erster DS) vorkommen.

Ich würde mir in die matches-Tabelle noch nen zusätzlichen Schlüssel für das winning-team anlegen, 0 bei untentschieden. Machts einfacher bei den Abfragen, anstatt immer den Torvergleich und die Heim- Auswärtsmannschaftsprüfung machen zu müssen.
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 24.06.2011, 14:25  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Zitat:
Zitat von douse29 Beitrag anzeigen
Aber ich denke das was du beschreibst funktioniert so nicht.
Doch, das geht so. Du hast in Deiner Logik den Self-Join vergessen.

Wenn ich jeden Sieg mit den darauf folgenden Niederlagen joine, dann wird die Länge der Serie aus den Spieltagen errechenbar. Und zwar ganz ohne Zählvariable.

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 24.06.2011, 20:14  
Neuer Benutzer
 
Registriert seit: 22.06.2011
Beiträge: 9
PHP-Kenntnisse:
Anfänger
douse29 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Jens Clasen Beitrag anzeigen
Doch, das geht so. Du hast in Deiner Logik den Self-Join vergessen.

Wenn ich jeden Sieg mit den darauf folgenden Niederlagen joine, dann wird die Länge der Serie aus den Spieltagen errechenbar. Und zwar ganz ohne Zählvariable.

Gruß Jens
Hast du mal n SELECT ? Ich bekomme das so nicht gebacken ...
douse29 ist offline   Mit Zitat antworten
Alt 25.06.2011, 11:23  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Kannst Du kriegen. Bitte poste mal die CREATE TABLE-Statements zu Deinen drei Tabellen und ein paar Beispielsdatensätze. (Bitte auch gleich als INSERT.) Das ganze hat einen Komplexitätsgrad, wo ich auch erst mal kurz spielen muss und kein ungetestetes SELECT hier ins Forum tackern möchte.

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 26.06.2011, 01:13  
Neuer Benutzer
 
Registriert seit: 22.06.2011
Beiträge: 9
PHP-Kenntnisse:
Anfänger
douse29 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Jens Clasen Beitrag anzeigen
Kannst Du kriegen. Bitte poste mal die CREATE TABLE-Statements zu Deinen drei Tabellen und ein paar Beispielsdatensätze. (Bitte auch gleich als INSERT.) Das ganze hat einen Komplexitätsgrad, wo ich auch erst mal kurz spielen muss und kein ungetestetes SELECT hier ins Forum tackern möchte.

Gruß Jens
Schonmal Danke, hier die Infos:

Code:
CREATE TABLE IF NOT EXISTS `eintraege` (
  `eintrags_id` int(11) NOT NULL AUTO_INCREMENT
  `bemerkung` varchar(32) DEFAULT NULL,
  `datum` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
  PRIMARY KEY (`eintrags_id`)
) ENGINE=InnoDB

CREATE TABLE IF NOT EXISTS `teams` (
  `team_id` int(11) NOT NULL AUTO_INCREMENT
  `teamname` varchar(75) NOT NULL DEFAULT ''
  PRIMARY KEY (`team_id`),
  UNIQUE KEY `teamname` (`teamname`)
) ENGINE=InnoDB 

CREATE TABLE IF NOT EXISTS `matches` (
  `match_id` int(11) NOT NULL AUTO_INCREMENT,
  `eintrags_id` int(11) NOT NULL DEFAULT '0',
  `team_heim_id` int(11) NOT NULL DEFAULT '0',
  `team_gast_id` int(11) NOT NULL DEFAULT '0',
  `tore_heim` int(3) NOT NULL DEFAULT '0',
  `tore_gast` int(3) NOT NULL DEFAULT '0',
  PRIMARY KEY (`match_id`)
) ENGINE=InnoDB 

INSERT INTO `eintraege` (`eintrags_id`, `bemerkung`, `datum`) VALUES
(1, '1. Spieltag 2010/11', '2010-08-19 14:46:08'),
(2, '2. Spieltag 2010/11', '2010-08-19 15:18:13'),
(3, '3. Spieltag 2010/11', '2010-08-19 19:07:17')

INSERT INTO `teams` (`team_id`, `teamname`) VALUES
(1, 'Team 1'),
(2, 'Team 2'),
(3, 'Team 3'),
(4, 'Team 4'),
(5, 'Team 5'),
(6, 'Team 6'),
(7, 'Team 7'),
(8, 'Team 8'),
(9, 'Team 9'),
(10, 'Team 10'),
(11, 'Team 11'),
(12, 'Team 12'),
(13, 'Team 13'),
(14, 'Team 14'),
(17, 'Team 15'),
(18, 'Team 16')

INSERT INTO `matches` (`match_id`, `eintrags_id`, `team_heim_id`, `team_gast_id`, `tore_heim`, `tore_gast`) VALUES
(1, 1, 1, 2, 2, 3),
(2, 1, 3, 4, 0, 1),
(3, 1, 5, 6, 5, 3),
(4, 1, 7, 8, 4, 3),
(5, 1, 9, 10, 1, 7),
(6, 1, 11, 12, 2, 1),
(7, 1, 13, 14, 4, 2),
(8, 1, 17, 18, 6, 1),
(9, 2, 14, 1, 2, 5),
(10, 2, 7, 10, 0, 0),
(11, 2, 2, 11, 2, 0),
(12, 2, 17, 9, 6, 0),
(13, 2, 12, 18, 6, 2),
(14, 2, 8, 3, 2, 1),
(15, 2, 4, 5, 5, 1),
(16, 2, 6, 13, 5, 0),
(17, 3, 9, 12, 4, 2),
(18, 3, 10, 3, 8, 1),
(19, 3, 5, 13, 2, 2),
(20, 3, 7, 17, 5, 1),
(21, 3, 2, 18, 10, 2),
(22, 3, 11, 14, 4, 2),
(23, 3, 4, 8, 0, 5)
Falls dir die Felder e.datum und e.bemerkung nicht ausreichen, könnte ich auch aus dem Feld e.bemerkung ein e.spieltag (INT) machen.
douse29 ist offline   Mit Zitat antworten
Alt 27.06.2011, 16:04  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Also ich muss eingestehen, dass ich mit meinem Vorschlag zwar recht nah dran war, mit dem Minimalabstand aber doch ein Stück weit daneben lag. Die Berechnung der Serien anhand der Statiwechsel ist aber trotzdem möglich. So lässt sich aber z.B. für ein Team die längste Siegesserie innerhalb einer Saison berechnen:

Code:
SELECT
  t.teamname,
  MAX(COALESCE(e2.spieltag,4)-COALESCE(e1.spieltag,4)) AS seriendauer
FROM
  teams t
    LEFT JOIN (matches m1 LEFT JOIN eintraege e1 ON m1.eintrags_id=e1.eintrags_id)
      ON t.team_id IN(m1.team_heim_id,m1.team_gast_id)
         AND ((t.team_id=m1.team_heim_id AND m1.tore_heim>m1.tore_gast) 
             OR (t.team_id=m1.team_gast_id AND m1.tore_gast>m1.tore_heim))
    LEFT JOIN (matches m2 LEFT JOIN  eintraege e2 ON m2.eintrags_id=e2.eintrags_id)
      ON t.team_id IN(m2.team_heim_id,m2.team_gast_id) 
         AND e2.datum>e1.datum
         AND e1.saison=e2.saison
         AND ((t.team_id=m2.team_heim_id AND m2.tore_heim<m2.tore_gast) 
             OR (t.team_id=m2.team_gast_id AND m2.tore_gast<m2.tore_heim))
GROUP BY
  t.team_id,
  t.teamname
Deine Tabelle "eintraege" habe ich dabei um ein Feld Spieltag und ein Feld Saison erweitert um die Berechenbarkeit sicher zu stellen. Das Spieltagfeld kann man notfalls allerdings auch mittels einer Zeilennummerberechnung mit Variablen emulieren. Damit ginge das ganze dann auch Saisonübergreifend.

Bei der Query ist noch zu beachten, dass in den COALESCE immer die Nummer des nächsten folgenden Spieltags zu nennen ist. Ansonsten geht die Rechnung natürlich nicht auf, da es bei Dauersiegern oder Verlierern u.Umst. in der DB keinen folgenden Statuswechsel oder eben keinen Sieg als Berechnungsgrundlage gibt.

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 28.06.2011, 10:53  
Neuer Benutzer
 
Registriert seit: 22.06.2011
Beiträge: 9
PHP-Kenntnisse:
Anfänger
douse29 befindet sich auf einem aufstrebenden Ast
Standard

@Jens
Vielen Dank!!!

Ich versuche gerade noch zu verstehen was du da genau gemacht hast, momentan scheitere ich noch
Im besonderen bereitet mir folgendes noch Probleme:
Code:
... MAX(COALESCE(e2.spieltag,4)-COALESCE(e1.spieltag,4)) AS seriendauer ...
Gruß
douse29
douse29 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mysql funktioniert nicht (Erweiterung nicht erkannt!?) pfump Server, Hosting und Workstations 10 17.03.2012 11:07
Mysql Server startet nicht mehr Nicolas2006 Datenbanken 2 20.03.2011 16:03
PHP Zugriff auf MySQL Community Server gewähren daemonTutorials Datenbanken 8 21.02.2011 12:28
MySQL Datentransfer (Dateigroesse 4MB) via Shell Zugang oder einfacher promoterlv Datenbanken 1 14.11.2010 22:12
[Erledigt] PHP bekommt keine Verbindung zu MySQL SaKe Datenbanken 15 20.09.2010 14:45
Mysql fehler bei externen Zugriff SteiniKeule Datenbanken 4 18.06.2010 12:54
PDO MySQL abfrage funktioniert nicht Bloodydead PHP Tipps 2010 8 18.06.2010 11:08
angeklickte checkboxen mit mysql auswerten klausmaus PHP Tipps 2010 2 24.05.2010 23:15
[Erledigt] MySQL - ERROR 1044 bei erstellen einer Datenbank _youngenterpriser_ Datenbanken 2 05.02.2008 17:56
Mysql Server Einstellunen Optimieren pchero Datenbanken 3 01.05.2007 19:50
[Erledigt] not allowed to connect to this MySQL server PHP Tipps 2005-2 2 23.09.2005 18:34
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
MYSQL läuft nur wenn /tmp auf 777 Datenbanken 5 06.07.2005 08:38
mysql root passwort vergessen Datenbanken 1 29.05.2005 11:33
MySQL Select-result auswerten? Datenbanken 7 21.05.2005 21:06

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql sortieren nach spalten inhalt

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:24 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum