dolito: Ligatabelle sortieren nach Punkten???

Hallo Leutz,

ich programmiere grad' eine Art Ligamanager auf PHP und MySQL Basis. Unter anderem habe ich die Tabelle 'Spiel' die so defiert ist:

nummer, heim, gast, heim_tore, gast_tore

Meine Frage lautet nun: Wie muß ich nun die Spiele abfragen (SQL), wenn daraus eine fussballübliche Tabelle entstehen soll
(Mannschaft, Anzahl Spiele, Gew., Unent., Verl., Tordifferenz, Tore, Gegentore, Punkte)? Dabei sollen die Mannsch. wie folgt geordnet werden:

Punkte(3 für Sieg, 1 für Unentsch., 0 für Niederlage)
Tordifferenz
geschossene Tore

Schaffe ich das mit einer einzigen, "reinen" SQL-Abfrage?

Ich bin dankbar für jede Antwort!!!

mfg dolito

  1. Hallo!

    Schaffe ich das mit einer einzigen, "reinen" SQL-Abfrage?

    Kommt auf die Datenbank drauf an.

    In MySQL bezweifle ich es zur Zeit, nur applikationsseitig bekommst Du das hin. Das sollte auch nicht so schwer sein. Du mußt die Daten in ein Array packen und dann abarbeiten.

    Für nur ein SQL-Statment benötigst eine Datenbank, in der Du z.B. eigene SQL-Funktionen implemenieren kannst.

    Ich habe so etwas ähliches zur EM in PostgreSQL gemacht. Dort habe ich an eine SQL-Funktion die "Wett-Punkt" und das Spielergebnis übergeben und die Funktion hat die Punktzahl zurück gegeben. Dann konnt ich die Punkte pro Spieler summieren und sortieren.
    Wie gesagt, das bekommst Du auch applikationsseitig hin, ist halt "mehr" Arbeit.

    MfG, André Laugks

    --
    L-Andre @ gmx.de
  2. yo,

    Meine Frage lautet nun: Wie muß ich nun die Spiele abfragen (SQL), wenn daraus eine fussballübliche Tabelle entstehen soll

    ja das geht mit einer abfrage möglich, aber erst mit einer hoffentlich vorhandenen zweiten tabelle, wo alle manschaften enthalten sind....

    Ilja

    1. ja das geht mit einer abfrage möglich, aber erst mit einer hoffentlich vorhandenen zweiten tabelle, wo alle manschaften enthalten sind....

      Das System programmiere ich ehrenamtlich für den Stadtverband Fussball meiner Heimatstadt. Damit sollen sie ihre komplette Website warten können, auch ohne Webmaster-wissen. Zur Zeit besteht die Datenbank aus 12 Tabellen, Tendenz steigend. Es gibt auch eine Tabelle Mannschaften :-)

      1. yo,

        dann sag uns doch mal, wie die beiden tabellen aufgebaut sind und miteinander zusammenhängen....

        Ilja

        1. dann sag uns doch mal, wie die beiden tabellen aufgebaut sind und miteinander zusammenhängen....

          ich glaub das würde zu weit führen, den dann müsste ich dir mindestens 6 weitere tabellen erklären z.B. Verein, Altersklasse, Spielklasse, Verband, Saison, Liga, Ligaman usw.

          aber ganz vereinfacht reicht doch Mannschaft aus:

          Spielnummer
          Heimmannschaft
          Gastmannschaft
          Tore der Heimmannschaft
          Tore der Gastmannschaft
          gelbe Karten der Heimmannschaft
          gelbe Karten der Gastmannschaft
          gelb rote ...
          gelb rote ...
          rote Karten ...
          rote Karten ...

          Eine Abfrage könnte z.B. so aussehen:

          SELECT <Siege>, <Unentsch>, <Niederl>, <Tore>, <Gegentore>, <Differenz>, <Punkte> FROM Mannschaft
          ORDER BY Punkte DESC AND Differenz DESC AND Tore DESC

          Doch wie ermittel ich die Punkte usw alles in einer Abfrage???

          mfg dolito

          1. yo,

            aber ganz vereinfacht reicht doch Mannschaft aus:

            das wird nicht ganz so einfach, da sich die manschaft so über zwei spalen verteilt, home und gast. besser wäre desegen eine tabelle mit allen manschaften...

            Ilja

            1. besser wäre desegen eine tabelle mit allen manschaften...

              äähhhhhhhhh, ja aber wie meinst'n dat?

              1. yo,

                äähhhhhhhhh, ja aber wie meinst'n dat?

                sven hat praktisch den gleichen gedanken, group by ist der weg zum ziel. dafür ist es aber sehr hilfreich, wenn alle spiele einer mannschaft sich in einer spalte widerspiegeln lassen. mit der einen tabelle stehen sie aber manchmal im heim und manchmal in gast-team...

                Ilja

                1. sven hat praktisch den gleichen gedanken, group by ist der weg zum ziel. dafür ist es aber sehr hilfreich, wenn alle spiele einer mannschaft sich in einer spalte widerspiegeln lassen. mit der einen tabelle stehen sie aber manchmal im heim und manchmal in gast-team...

                  So was hab' ich mir auch schon gedacht nur wie soll ich dann unabhängig von der Tabelle Spiel und mit reiner binären Logik zwischen Sieg und Niederlage oder auch Unentschieden entscheiden

                  Und ich bin ja auch erst MySQL Anfänger:
                  wie verbinde ich dann COUNT damit:
                  SELECT (COUNT(Siege)*re.punkte_sieg
                  +COUNT(Unentschieden)*re.punkte_unent
                  +COUNT(Niederlagen)*re.punkte_niederlage) AS Punkte
                  FROM Spiel sp
                  INNER JOIN Regeln re
                  ORDER BY Punkte DESC;

                  so ungefähr? Bloß wie erkennt MySQL dann einen Sieg oder eine Niederlage?

                  mfg dolito

                  1. yo

                    Und ich bin ja auch erst MySQL Anfänger:

                    ruhig brauner ;-)

                    wie bereits gesagt, man braucht eine zweite tabelle und zwar eine, die alle manschaften auflistet und wie sie mit der spieltabelle verbunden ist. vorher geht reichlich wenig nur mit einer abfrage.

                    Ilja

  3. Moin!

    Unter anderem habe ich die Tabelle 'Spiel' die so defiert ist:

    nummer, heim, gast, heim_tore, gast_tore

    Das ist schlecht.

    Tore sind Tore sind Tore... Wenn du zwischen Heimtoren und Gasttoren unterscheidest, mußt du hinterher diese Unterscheidung mühsam wieder aufheben. In SQL geht das nur sehr schwierig - und mit MySQL 3 wahrscheinlich garnicht.

    Du brauchst:
    1 Tabelle mit allen teilnehmenden Vereinen der Liga. Also mindestens mit den Spalten Vereins-ID, Vereinsname
    1 Tabelle mit allen stattfindenden Spielen: Spiel-ID, Heim (Vereins-ID), Gast (Vereins-ID)
    1 Tabelle mit den Ergebnissen, die jede Mannschaft in einem Spiel erzielt hat: Ergebnis-ID, Spiel-ID, Vereins-ID, Tore, Punkte

    Diese drei Tabellen kannst du mit JOINs wunderbar abfragen und so leicht ermitteln, welche Spielergebnisse es einerseits gab, und andererseits auch, wer die meisten Punkte und Tore in der Tabelle hat.

    Schaffe ich das mit einer einzigen, "reinen" SQL-Abfrage?

    Mit den drei Tabellen, wie oben dargestellt, sicherlich. Behaupte ich einfach mal. :)

    - Sven Rautenberg

    1. nummer, heim, gast, heim_tore, gast_tore
      Das ist schlecht.

      Tore sind Tore sind Tore... Wenn du zwischen Heimtoren und Gasttoren unterscheidest, mußt du hinterher diese Unterscheidung mühsam wieder aufheben. In SQL geht das nur sehr schwierig - und mit MySQL 3 wahrscheinlich garnicht.

      »»

      Auf meinem Server läuft die 4er Version.
      Und wenn ich nicht unterscheide wie soll ich dann später die geschossenen Tore einer Mannschaft oder die Spielergebnisse abfragen?

      mfg dolito

      1. Moin!

        Auf meinem Server läuft die 4er Version.

        Hilft dir nicht unbedingt viel.

        Und wenn ich nicht unterscheide wie soll ich dann später die geschossenen Tore einer Mannschaft oder die Spielergebnisse abfragen?

        Du unterscheidest ja schon - indem die Mannschafts-ID in der Spieletabelle entweder als HEIM oder GAST eingetragen ist. Aber die geschossenen Tore - die sind in einer ganz anderen Tabelle und alle in _EINER_ Spalte, so dass man sie prima mit GROUP BY aufsummieren lassen kann - ebenso die erzielten Punkte. Und die gespielten Spiele etc...

        SELECT sum(tore) as s-tore,sum(punkte) as s-punkte,count(vereins-id) as s-spiel FROM ergebnisse GROUP BY vereins-id ORDER BY s-punkte DESC, s-tore DESC

        Fertig. Eine Abfrage mit Punkten und Toren.

        Natürlich ließe sich das ganze optimieren. Dir fehlen hier beispielsweise die Gegentore. Die stehen _eigentlich_ verknüpft über die Spiel-Tabelle wieder in der Ergebnistabelle drin. Diesen zweifachen JOIN könnte man natürlich einbauen - alternativ vielleicht einfach eine weitere Spalte "Gegentore" anlegen. Die Daten sind dann redundant, aber machen es beim Summieren einfacher. Die Tordifferenz läßt sich dann auch ganz leicht ermitteln - falls du danach sortieren willst.

        - Sven Rautenberg

        1. Wenn ich das jetzt richtig verstanden habe ( is ja schon spät :-) ), dann lege ich für jedes Spiel zwei Datensätze an:

          sp_nr mannmannschaft mann_id tore
          1      Energie        1       1
          1      Bayern         2       2

          aber muss ich dann nicht noch zusätzlich die Punkte in die Tabelle eintragen, was ja eigentlich die Datenbank erledigen soll. Die Punkte für S,U,N stehen nämlich in der Tabelle Regeln, die sich ja von Saison zu Saison ändern können!?

          Oder liege ich jetzt ganz falsch?

          mfg dolito

          1. Moin!

            aber muss ich dann nicht noch zusätzlich die Punkte in die Tabelle eintragen, was ja eigentlich die Datenbank erledigen soll. Die Punkte für S,U,N stehen nämlich in der Tabelle Regeln, die sich ja von Saison zu Saison ändern können!?

            So ist es - bzw. _könnte_ man es natürlich auch wieder aus der Tabelle selbst ermitteln, aber das würde die ganze Sache dann wieder zu kompliziert machen.

            - Sven Rautenberg

            1. So ist es - bzw. _könnte_ man es natürlich auch wieder aus der Tabelle selbst ermitteln, aber das würde die ganze Sache dann wieder zu kompliziert machen.

              Leider muss ich es so kompliziert machen. Du kannst ja mal meine Antwort auf http://forum.de.selfhtml.org/?t=89605&m=536021 lesen, dann weisst du vielleicht wieso?

              mfg dolito

          2. use Mosche;

            Wenn ich das jetzt richtig verstanden habe ( is ja schon spät :-) ), dann lege ich für jedes Spiel zwei Datensätze an:

            sp_nr mannmannschaft mann_id tore
            1      Energie        1       1
            1      Bayern         2       2

            Beschreibt mann_id nicht auch den Namen der Mannschaft? Ist das Attribut 'mannmannschaft' daher nicht überflüssig?

            aber muss ich dann nicht noch zusätzlich die Punkte in die Tabelle eintragen, was ja eigentlich die Datenbank erledigen soll. Die Punkte für S,U,N stehen nämlich in der Tabelle Regeln, die sich ja von Saison zu Saison ändern können!?

            Du wirst ja alte Daten auch aufheben. Dann bedenke bitte, was passiert, wenn du alte Daten hast (aus einer Zeit mit z.B. 2-Punkte-Regel) und änderst die Regeln (z.B. zur 3-Punkte-Regel). Dadurch können sich alte Tabellenstände ändern (Bsp: der 1.FC Kaiserslautern wäre nach der 2-Punkte Regel damals nicht abgestiegen, wohl aber nach der "neuen" 3-Punkte-Regel).
            D.h.: du mußt ein Attribut in die Regel-Tabelle einfügen, welches beschreibt, in welchem Zeitraum diese Regel gültig war (bzw., um dir gleich das richtige Stichwort zu geben: es reicht, zu beschreiben, ab wann die neue Regel gültig ist). Das ist ein recht großer Aufwand.

            Einfacher ist es in diesem Fall auf jeden Fall, die aktuell gütligen Regeln in der Regel-Tabelle zu halten (ohne Zeitbeschränkung) und dann in die 'Spiel'-Tabelle, wie du sie oben beschreibst, die 'aktuellen' Punkte rein zuschreiben. Das verhindert die Probleme, die durch meinen vorherigen Absatz beschrieben werden.

            use Tschoe qw(Matti);

            --
              Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
            1. Beschreibt mann_id nicht auch den Namen der Mannschaft? Ist das Attribut 'mannmannschaft' daher nicht überflüssig?

              mannmannschaft ist ein Tippfehler :-) und heißt eigentlich mannschaft. mann_id beschreibt nur ob es sich hierbei um die Heim- oder Gastmannschft handelt, deshalb auch zwei Datensätze pro Spiel! mannschft ist eigentlich auch mann_nr und stellt die Verknüpfung zur Tabelle Mannschaft her.

              Du wirst ja alte Daten auch aufheben.    D.h.: du mußt ein Attribut in die Regel-Tabelle einfügen, welches beschreibt, in welchem Zeitraum diese Regel gültig war (bzw., um dir gleich das richtige Stichwort zu geben: es reicht, zu beschreiben, ab wann die neue Regel gültig ist). Das ist ein recht großer Aufwand.

              Daran ist gedacht, denn wie schon erwähnt gehört zur ganzen Datenbank eine Ansammlung von 11 Tabellen, Tendenz steigend. Aber das gehört ja nicht zu meinem Problem, nicht mehr jedenfalls.

              Ich erstelle eine Homepage für unseren Stadtverband Fussball. Dazu gehört ein System mit dem auch jemand ohne Kentnisse von Servern und Programmierung die Seite warten kann. Und das über mehrere Jahre hinweg. Für die Planung im Vorfeld habe ich ca. 6 Wochen gebraucht. Nur dafür habe ich halt keine Lösung gefunden!

              mfg dolito

              1. Moin!

                Ich erstelle eine Homepage für unseren Stadtverband Fussball. Dazu gehört ein System mit dem auch jemand ohne Kentnisse von Servern und Programmierung die Seite warten kann. Und das über mehrere Jahre hinweg. Für die Planung im Vorfeld habe ich ca. 6 Wochen gebraucht. Nur dafür habe ich halt keine Lösung gefunden!

                Ja und? Was hat die Datenbank mit der Eingabemaske zu tun? Natürlich gibt der Benutzer die Daten in einem gewohnten Format ein, das Zerpflücken und auswerten erledigst du mit deinem Skript. Es wäre beispielsweise sinnlos, den Benutzer die Punkte eingeben zu lassen, die ergeben sich ja aus den geschossenen Toren - um nur mal ein Beispiel zu nennen.

                - Sven Rautenberg

    2. Hi,

      1 Tabelle mit allen teilnehmenden Vereinen der Liga. Also mindestens mit den Spalten Vereins-ID, Vereinsname
      1 Tabelle mit allen stattfindenden Spielen: Spiel-ID, Heim (Vereins-ID), Gast (Vereins-ID)
      1 Tabelle mit den Ergebnissen, die jede Mannschaft in einem Spiel erzielt hat: Ergebnis-ID, Spiel-ID, Vereins-ID, Tore, Punkte

      Seh ich anders. 2 Tabellen reichen.
      Die erste mit den Vereinsinformationen wie von Dir vorgesehen.
      Die zweite mit den Spiel-Informationen.
      Spiel-ID, Heim (Vereins-ID), Gast (Vereins-ID), Heim-Tore, Gast-Tore
      Meiner Meinung nach gehören die erzielten Tore zu den Informationen, die zu einem Spiel gehören.

      Die Punkte-Verteilung ergibt sich aus den Toren, braucht also nicht extra (redundant) gespeichert werden.

      Setzt man anfangs die Spalten mit den Toren auf NULL und nach einem Spiel auf andere Werte (also 0 oder mehr), braucht man auch keine weitere Spalte für die Information, ob ein Spiel schon stattgefunden sind.

      cu,
      Andreas

      --
      MudGuard? Siehe http://www.Mud-Guard.de/
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hi

        Das sehe ich ganz genauso wie Du! Nur was meine Frage von Anfang an war:

        Wie lautet dann die Abfrage um die Tabelle der Mannschaften geordnet nach Punkten, Tordifferenz und geschossenen Toren darzustellen?

        mfg dolito

      2. Moin!

        Seh ich anders. 2 Tabellen reichen.

        Natürlich _kann_ man das mit zwei Tabellen machen. Aber das Tabellendesign sollte sich nicht an einer möglichst menschenfreundlichen Datenspeicherung in möglichst wenigen Tabellen orientieren, sondern primär an den später zu erledigenden Abfragen.

        Und da ist es einfach unpraktisch, wenn man die Summe geschossener Tore aus _zwei_ Spalten zusammenzählen muß. Weil das in _einer_ SQL-Abfrage schwierig geht.

        Machen wir mal zwei Mannschaften und zwei Spiele:

        Spiel-ID, HeimID, GastID, Heim-Tore, Gast-Tore

        1         1       2        0           1
             2         2       1        1           0

        Aufgabe: Formuliere _eine_ Abfrage, welche alle geschossenen Tore der zwei Mannschaften ergibt, die Tordifferenz der Mannschaften, die zu verteilenden Punkte je Spiel (Sieg: 3 Punkte, Unentschieden 1 Punkt) summiert und die Resultate sortiert mit dem Punkthöchsten zuerst, bei Punktegleichstand den mit der besseren Tordifferenz, bei Gleichstand den mit den meisten Toren.

        Gewünschtes Resultat:
        MannID Pkte Diff  Tore
          2     6    +2    2
          1     0    -2    0

        Da finde ich meine Version mit einem SELECT auf eine einzige Tabelle mit GROUP BY doch irgendwie sehr elegant.

        Die Punkte-Verteilung ergibt sich aus den Toren, braucht also nicht extra (redundant) gespeichert werden.

        Früher gab es für einen Sieg nur zwei Punkte. Wie speicherst du das ab?

        Setzt man anfangs die Spalten mit den Toren auf NULL und nach einem Spiel auf andere Werte (also 0 oder mehr), braucht man auch keine weitere Spalte für die Information, ob ein Spiel schon stattgefunden sind.

        Wenn das Spiel noch nicht eingetragen ist, ist das eigentlich eine ausreichende Information, oder? Da braucht man kein NULL - außer man gibt vorher den Spielplan ein, dann ist das natürlich was anderes.

        - Sven Rautenberg

        1. yo,

          Aber das Tabellendesign sollte sich nicht an einer möglichst menschenfreundlichen Datenspeicherung in möglichst wenigen Tabellen orientieren, sondern primär an den später zu erledigenden Abfragen.

          nein, das daten-design hat mit den abfragen erst einmal wenig zu tun. leztzlich kann man ja nicht jedesmal die datenstruktur einer aktuellen abfrage anpassen.

          Ilja

          1. Moin!

            yo,

            Aber das Tabellendesign sollte sich nicht an einer möglichst menschenfreundlichen Datenspeicherung in möglichst wenigen Tabellen orientieren, sondern primär an den später zu erledigenden Abfragen.

            nein, das daten-design hat mit den abfragen erst einmal wenig zu tun. leztzlich kann man ja nicht jedesmal die datenstruktur einer aktuellen abfrage anpassen.

            Ist es nicht ein Grundsatz, gleichartige Daten in derselben Spalte zu speichern? Tore sind nun einmal Tore, egal ob die zuhaus oder auswärts erzielt werden.

            Wenn die Tore alle in _einer_ Spalte stehen, dann kann man sie einfach summieren (das ist eine der Anforderungen), aber man _kann_ sie auch über einen JOIN auf die Spieletabelle getrennt in Heim- und Auswärtstore auswerten.

            Wenn sie in getrennten Spalten stehen, kann man sie getrennt nach Heim und Auswärts aufrufen, die Zusammenfassung für _eine_ Mannschaft in einer Abfrage für _alle_ Mannschaften fällt aber ungleich schwerer.

            - Sven Rautenberg

            1. yo,

              zwei ta

              Ist es nicht ein Grundsatz, gleichartige Daten in derselben Spalte zu speichern?

              um gottes willen, wer sagt so was ?

              Tore sind nun einmal Tore, egal ob die zuhaus oder auswärts erzielt werden.

              aber nicht um europa-cup...da zählen auswärtstore eventuell doppelt....

              Wenn die Tore alle in _einer_ Spalte stehen, dann kann man sie einfach summieren (das ist eine der Anforderungen), aber man _kann_ sie auch über einen JOIN auf die Spieletabelle getrennt in Heim- und Auswärtstore auswerten.

              mudguard hat grundsäzlich recht, dass zwei tabellen reichen. was du willst, sind sogenannte prozess daten mit in die tabellen einbringen, um die abfragen leichter zu machen. aber prozess-daten sind böse....

              Wenn sie in getrennten Spalten stehen, kann man sie getrennt nach Heim und Auswärts aufrufen, die Zusammenfassung für _eine_ Mannschaft in einer Abfrage für _alle_ Mannschaften fällt aber ungleich schwerer.

              letztlich hilft eine weitere tabelle, eine manschaft in eine spalte zu bekommen, nämlich die, wo alle teams aufgelistet sind. dazu braucht an noch die tabelle mit den ergebnissen, der rest ist kopfarbeit...

              Ilja

              1. Moin!

                Ist es nicht ein Grundsatz, gleichartige Daten in derselben Spalte zu speichern?

                um gottes willen, wer sagt so was ?

                Im Zweifel einfach nur ich. :)

                Tore sind nun einmal Tore, egal ob die zuhaus oder auswärts erzielt werden.

                aber nicht um europa-cup...da zählen auswärtstore eventuell doppelt....

                Das macht die Auswerteroutine schwieriger - aber auch nur, was die Punkteverteilung angeht, nicht die Toreverteilung.

                Außerdem ist ein Cup keine Liga. ;)

                mudguard hat grundsäzlich recht, dass zwei tabellen reichen. was du willst, sind sogenannte prozess daten mit in die tabellen einbringen, um die abfragen leichter zu machen. aber prozess-daten sind böse....

                Nö, nicht unbedingt. Aber es könnte die Sache erheblich erleichtern.

                letztlich hilft eine weitere tabelle, eine manschaft in eine spalte zu bekommen, nämlich die, wo alle teams aufgelistet sind. dazu braucht an noch die tabelle mit den ergebnissen, der rest ist kopfarbeit...

                Wir reden jetzt schon den ganzen Abend theoretisch um den Brei herum, aber ein gutes Gegenbeispiel wurde mir noch nicht präsentiert. Mich interessiert da ja insbesondere der SELECT mit MySQL.

                Wenn das mit zwei oder auch drei Tabellen geht, dann zeig das doch mal!

                - Sven Rautenberg

                1. yo,

                  so bin wieder da, war doch sehr spät gestern und schon zuviel wein gehabt.....

                  Im Zweifel einfach nur ich. :)

                  also gleichartige daten sind nicht gerade ein kriterium dafür, sie in eine spalte zu nehmen. vielleicht ist es auch einfach nur der falsche begriff für das richtige. ein spalte spiegelt in aller regel ein attribut einer entität wieder, mal von PK und FK abgesehen. inwieweit die nun gleichartig sind, sei mal dahin gestellt. bei einer rechnung könnte das nämlich zum einen ein neues sofa und zum anderen die keksdose von ikea sein. auf der anderen seite können es alle nachnamen der kunden sein, die sehr "gleichartig" sind. aber der andere fall geht auch, jemand will doppelnamen in zwei spalten unterbringen, z.b familienname und jetztiger nachname. die daten wären auch "gleichartig" und trotzdem in unterschiedlichen spalten. der begriff "gleichartig" ist auch irgendwie für mich nicht so richtig greifbar.

                  Außerdem ist ein Cup keine Liga. ;)

                  ok, dann lassen wir das einfach weg....

                  Nö, nicht unbedingt. Aber es könnte die Sache erheblich erleichtern.

                  man könnte auch direkt das alter von personen mit in einer tabelle nehmen. das würde abfragen nach dem alter auch erleichtern. aber prozess-daten werden in aller regel (ausnahme gibt es immer) rausgehalten, um die konsistenz zu gewährleisten. in diesem beispiel würde es eventuell sogar sinn machen, dies zu tun, da sich die spiele ja nicht mehr im nachhinein ändern, wie zum beispiel das alter. aber dafür müsste er dann die struktur ändern und vor allem, es würde das eigentliche problem nicht lösen, nämlich alle manschaften in einer spalte zu haben.

                  Wenn das mit zwei oder auch drei Tabellen geht, dann zeig das doch mal!

                  nun weiter unten habe ich ja schon mehrfach versucht, den aufbau der manschaftstabelle zu bekommen, die es sicherlich gibt. wenn ich behaupte, es geht mit zwei tabellen, da wäre es von vorteil, wenn ich auch die zweite hätte ? ;-)

                  aber vielleicht fällt mir ja noch eine lösung mit der einen tabelle ein, mal sehen. mit PL/SQL würde das gehen, aber das ist geschummelt, dann kann man gleich programmieren.

                  Ilja

                  1. Moin!

                    Wenn das mit zwei oder auch drei Tabellen geht, dann zeig das doch mal!

                    nun weiter unten habe ich ja schon mehrfach versucht, den aufbau der manschaftstabelle zu bekommen, die es sicherlich gibt. wenn ich behaupte, es geht mit zwei tabellen, da wäre es von vorteil, wenn ich auch die zweite hätte ? ;-)

                    Stell dir einfach vor, du könntest deine eine, zwei, drei oder sonstwie belienig vielen Tabellen vollkommen frei definieren - bis eben auf die eine Ausnahme, die du ja schon festgelegt hast, dass das Spielergebnis Tore-Heim gegen Tore-Gast in _einer_ Zeile _einer_ Tabelle vorkommen muß, und sich daraus der Rest abfragen läßt.

                    Das Thema ist hier im Forum natürlich nicht neu. http://forum.de.selfhtml.org/archiv/2003/9/58905/#m331023 :)

                    aber vielleicht fällt mir ja noch eine lösung mit der einen tabelle ein, mal sehen. mit PL/SQL würde das gehen, aber das ist geschummelt, dann kann man gleich programmieren.

                    Wenn man was programmieren kann, dann geht's natürlich. Es wäre ja immer möglich, die einzelnen Ergebnisse einfach simpel abzufragen und von Programmcode dann zu einer Tabelle zusammenssetzen zu lassen. Das ist dann aber wirklich geschummelt.

                    - Sven Rautenberg

                    1. yo sven,

                      Das Thema ist hier im Forum natürlich nicht neu. http://forum.de.selfhtml.org/archiv/2003/9/58905/#m331023 :)

                      ich denke mal, da sollten wir doch glatt das archiv aktualisieren oder ?

                      Ilja

  4. Halli hallo,

    hier bin ich wieder frisch und munter!

    Also ersteinmal freue ich mich natürlich das ich bei euch allen so viel an theoretischen Grundlagen rausgekitzelt habe.

    Jedoch bin ich zwar Anfänger in MySQL das heisst aber nicht, dass ich keine Ahnung von relationalen Datenbanken habe, oder?

    • Oder gar die Logik nicht verstehe!

    Um alle Zweifel aus der Welt zu schaffen, hier das von der Datenbank was euch interessieren könnte:

    Verein(ver_nr,ver_link,ver_name)

    Altersklasse(altkl_nr,altkl_name,altkl_von,altkl_bisaltkl_sp_laenge)

    Spielklasse(spkl_nr,spkl_name)

    Saison(sai_nr,sai_name)

    Mannschaft(man_nr,ver_nr,altkl_nr,man_t,man_sp_t,man_sp_z)

    Liga(lig_nr,sai_nr,spkl_nr,lig_sp_t,lig_sp_z,lig_sp_r)

    LigaMan(lig_nr,man_nr,ligaman_aktiv)

    Spiel(sp_nr,sai_nr,sp_heim,sp_gast,sp_h_t,sp_g_t,<<6 Spalten für Karten>>,sp_date,sp_time)

    Regeln(reg_nr,sai_nr,<<Spalten für die ganzen Regeln>>)

    zusätzliche Tabellen (noch nicht ganz spruchreif):

    Schiedsrichter, Verband und noch eine die ich mir überlegt habe aber in der ganzen Aufregung vergessen habe, schade :-) !

    So, also ich denke mal das ihr mein Problem ein wenig falsch verstanden habt (wahrscheinlich liegt's ja an mir). Ich habe JETZT kein Problem MEHR mit dem Design. Meine Frage bezog sich ausschliesslich auf die SYNTAX der SQL-Abfrage. Sicher bekomme ich das auch mit einer Abfrage ohne sortieren hin und lasse dann ein Skript berechnen und sortieren. Aber warum so viel Zeit vergeuden (Arbeitsdauer der Abfragen und des Skriptes) ist diese eine MySQL-Abfrage nicht doch ein wenig schneller?

    Also, wenn mir jemand jetzt noch bei der Syntax helfen kann, ohne gleich meine ganze Datenbank umstellen zu wollen, dann bitte ich ihn hier zu posten!

    Denoch möchte ich allen für die Mühe und die Zeit danken die sie aufgebracht haben.

    mfg dolito

    1. yo,

      Jedoch bin ich zwar Anfänger in MySQL das heisst aber nicht, dass ich keine Ahnung von relationalen Datenbanken habe, oder?

      also, ich behaupte einfach mal, wer ahnung von rdbms hat, der ist auch kein mysql anfänger mehr, vieles gleicht sich dabei nämlich.

      durch die kürzel erkenne ich nicht bei allen spalten den sinn und somit deren daten. aber ich glaube, es sind sowieso nur zwei tabellen relevant (mannschaften und spiele) und da auch nicht alle spalten. das behaupte ich jedenfalls und Sven sitzt mir dabei schon im nacken. vielmehr mudguard hat damit angefangen, soll er die suppe doch auslöffeln. ;-)

      nur noch eine randbemerkung. vielleicht solltest du trotzdem noch mal über das daten-design nachdenken. so haben zum beispiel die 6 spalten für karten in der tabelle spiele nichts zu suchen, sondern sollten eigentlich in eine extra tabelle. was passiert, wenn es 7 karten gab, geht einer straffrei aus ?

      und eine frage zu query habe ich aber noch. gehe ich richtig in der annahme, dass in der tabelle spiele bei den spalten sp_heim und sp_gast jeweils die fremdschlüssel zur tabelle manschaften man_nr stehen ?

      Ilja

      1. yo,

        Jedoch bin ich zwar Anfänger in MySQL das heisst aber nicht, dass ich keine Ahnung von relationalen Datenbanken habe, oder?

        also, ich behaupte einfach mal, wer ahnung von rdbms hat, der ist auch kein mysql anfänger mehr, vieles gleicht sich dabei nämlich.

        die Logik passt eigentlich nur die vielen, vielen Befehle und mir Sitzt die Zeit im Nacken, da die Saison schon angefangen hat (arghh)!

        durch die kürzel erkenne ich nicht bei allen spalten den sinn und somit deren daten. aber ich glaube, es sind sowieso nur zwei tabellen relevant (mannschaften und spiele) und da auch nicht alle spalten. das behaupte ich jedenfalls und Sven sitzt mir dabei schon im nacken. vielmehr mudguard hat damit angefangen, soll er die suppe doch auslöffeln. ;-)

        du hast ganz recht das ist ja das was ich die ganze zeit sage. eigentlich reicht für diese betrachtung auch die tabelle spiele, denn mit der Tabelle Mannschaft sind ja nur der Verein usw verknüpft was ja hier erstmal für die abfrage total wurst ist!

        nur noch eine randbemerkung. vielleicht solltest du trotzdem noch mal über das daten-design nachdenken. so haben zum beispiel die 6 spalten für karten in der tabelle spiele nichts zu suchen, sondern sollten eigentlich in eine extra tabelle. was passiert, wenn es 7 karten gab, geht einer straffrei aus ?

        hätte ich vieleicht besser erklären sollen:

        1.Spalte: Anzahl gelbe Karten der Heimmannschaft
        2.Spalte: Anzahl gelbe Karten der Gastmannschaft
        3.Spalte: Anzahl gelb-rote Karten der Heimmannschaft
        4.Spalte: Anzahl gelb-rote Karten der Gastmannschaft
        5.Spalte: Anzahl der roten Karten der Heimmannschaft
        6.Spalte: Anzahl der roten Karten der Gastmannschaft

        und eine frage zu query habe ich aber noch. gehe ich richtig in der annahme, dass in der tabelle spiele bei den spalten sp_heim und sp_gast jeweils die fremdschlüssel zur tabelle manschaften man_nr stehen ?

        c'est correct! (oder so)

        mfg dolito

        1. yo,

          ohne gewähr wie immer und eventuelle folgende korrekturen:

          SELECT man_nr,
          SUM(IF((man_nr = sp_heim AND sp_h_t > sp_g_t) OR (man_nr = sp_gast AND sp_h_t < sp_g_t), 1, 0)) AS Gewonnen,
          SUM(IF((man_nr = sp_heim AND sp_h_t < sp_g_t) OR (man_nr = sp_gast AND sp_h_t > sp_g_t), 1, 0)) AS Verloren,
          SUM(IF(sp_h_t = sp_g_t, 1, 0)) AS Unentschieden,
          SUM(IF(man_nr = sp_heim, sp_h_t, 0)) + SUM(IF(man_nr = sp_gast, sp_g_t, 0)) AS Tore,
          SUM(IF(man_nr <> sp_heim, sp_h_t, 0)) + SUM(IF(man_nr <> sp_gast, sp_g_t, 0)) AS Gegentore,
          SUM(IF(man_nr = sp_heim, sp_h_t, 0)) + SUM(IF(man_nr = sp_gast, sp_g_t, 0)) -
          SUM(IF(man_nr <> sp_heim, sp_h_t, 0)) - SUM(IF(man_nr <> sp_gast, sp_g_t, 0)) AS Tordifferenz,
          COUNT(*) AS Spieleanzahl
          FROM manschaft AS m LEFT JOIN spiel AS s ON (m.man_nr = s.sp_heim OR m.man_nr = s.sp_gast)
          GROUP BY man_nr
          ORDER BY 2 DESC, 4 DESC, 7 DESC

          Ilja

          1. Danke dir Ilja

            auf so etwas habe ich eigentlich gewartet, ich werde es nachher mal ausprobieren, muss jetzt aber erst mein Auto aus der Werkstatt holen!
            Ich schreib dann heute nachmittag oder abend mal wie's funktioniert.

            Nochmals vielen Dank!

            mfg dolito

            1. yo Dolito,

              auf so etwas habe ich eigentlich gewartet...

              unabhängig ob es funktioniert oder nicht, es war schon sehr früh die rede davon, dass du uns doch mal die zweite tabelle mit den mannschaften gibts, damit wir es ausprobieren können. aber du hast dih ziemlich lange erfolgreich dagegen gewehrt, sozusagen ein wenig "rumgezickt". ;-)

              aber schau mal, was dabei raus kommt, ich bin mir nämlich alles andere als sicher.

              Ilja

              1. Halli hallo Ilja,

                aber schau mal, was dabei raus kommt, ich bin mir nämlich alles andere als sicher.

                ich hab's ausprobiert zwar mit nur zwei Mannschaften die ein einziges Spielgegeneinander hatten, aber ich kann dir sagen:

                es funzt!!!!!!!!!!

                Und alles andere wie z.B. die Regeln, Punkte, Punktabzüge usw. woran sich etwaige Leute so hochputschen (und dabei das Wesentliche vergessen :-) ) sind kleine Feinheiten die in nichteinmal 5 Minuten eingebaut sind!

                Und zu der Bemerkung von, ich glaube Sven, man könne doch locker phpMyAdmin nehmen nur eins:

                Die Webseite möchte ich nach der Programmierung so gut wie nicht warten, alles soll über ein eigens von mir, dafür programmiertes Frontend passieren, welches auch "Dummies" bzw. absolute Laien bedienen können. Und diese wissen mit Sicherheit nichteinmal das es überhaupt Datenbanken gibt :-) !!!

                Aber dennoch möchte ich mich bei allen Gesprächspartnern bedanken und sagen weiter so!
                Nur durch sollche Diskusionen kommt man letztends voran!

                Ich melde mich wieder wenn ich alles fertig habe (oder das nächste Problem auftritt :-) )!

                mfg dolito

          2. Moin!

            ohne gewähr wie immer und eventuelle folgende korrekturen:

            Wahrlich ein mächtiger SQL-Ausdruck.

            Bleibt nur eine Sache, sozusagen das "Cup"-Detail: ;)

            Wie kann man bei deiner Datenstruktur Strafpunkte für einen Verein eintragen, wie z.B. in der letzten Bundesligasaison geschehen? Da startete ein Verein mit drei Minuspunkten (ich hab vergessen, wer's war).

            Bei meinem Ansatz geht sowas. :)

            - Sven Rautenberg

            1. yo Sven,

              Bleibt nur eine Sache, sozusagen das "Cup"-Detail: ;)

              hmmm, war es nicht dein vorschlag, den aussen vor zu lassen ? ;-)

              ausserdem spielt das nur eine rolle bei einem ko system und nicht im ligabetrieb.

              Wie kann man bei deiner Datenstruktur Strafpunkte für einen Verein eintragen, wie z.B. in der letzten Bundesligasaison geschehen? Da startete ein Verein mit drei Minuspunkten (ich hab vergessen, wer's war).

              es war kaiserlautern, wenn mich nicht alles täuscht und es ist auch nicht meine datenstruktur. ich habe nur auf einer vorhandenen datenstruktur eine abfrage gemacht.

              Bei meinem Ansatz geht sowas. :)

              nun, in meiner abfrage kann man sicherlich auch strafpunkte einbringen, diese information muss aber irgendwo in einer tabelle stehen. dieses feld nehmen und einfach subtrahieren von der gesamtpunktzahl, die man sicherlich auch leicht errechnen kann, wenn man die anzahl der gewonnen spiele und unetschieden hat. aber erst mal abwarten, was dabei rauskommt, wenn er die abfrage ausprobiert.

              Ilja

              1. Moin!

                nun, in meiner abfrage kann man sicherlich auch strafpunkte einbringen, diese information muss aber irgendwo in einer tabelle stehen. dieses feld nehmen und einfach subtrahieren von der gesamtpunktzahl, die man sicherlich auch leicht errechnen kann, wenn man die anzahl der gewonnen spiele und unetschieden hat. aber erst mal abwarten, was dabei rauskommt, wenn er die abfrage ausprobiert.

                Das ist eben der Unterschied. Bei der von dir verwendeten Struktur muß so eine Information in einer neu zu schaffenden Tabelle abgelegt werden. Bei der von mir verwendeten Struktur muß lediglich ein weiterer Datensatz in die schon vorhandene Tabelle eingefügt werden.

                Krass ausgedrückt: Bei "deiner" Struktur (jaja, hast du dir nicht ausgedacht, sondern nur abgefragt) muß man die gesamte Applikation vor der Datenbank umstricken, und es es nur, um eine feste Abfrage "IF saison = 2003 AND verein = kaiserslautern then punkte = punkte - 3" einzuprogrammieren.

                Bei "meiner" Struktur geht der Administrator einmal mit PHPMyAdmin bei und fügt manuell einen neuen Datensatz ein - fertig. Naja, so einfach _könnte_ es sein, bleibt die Frage, welche weiteren Informationen normalerweise in der Tabelle drinstehen und welche Verknüpfungen existieren. Wie wirkt sich NULL da aus?

                Und da dolitos Aufgabe ja offenbar nicht die bekannte Bundesliga umfaßt, sondern mehrere Ligen in mehreren Altersklassen mit mehreren Vereinen etc., ist die Wahrscheinlichkeit, dass es auch hier zu derartigen Strafen kommt, durchaus gegeben.

                - Sven Rautenberg

                1. yo,

                  Das ist eben der Unterschied. Bei der von dir verwendeten Struktur muß so eine Information in einer neu zu schaffenden Tabelle abgelegt werden. Bei der von mir verwendeten Struktur muß lediglich ein weiterer Datensatz in die schon vorhandene Tabelle eingefügt werden.

                  also, ich habe ein wenig das gefühl, du bringst einen vergleich an, der gar nicht zur diskussion steht. ob dein ansatz besser oder schlechter ist, darüber diskutiert hier keiner ausser dir. niemand hat wertungen reingebracht.

                  alles was ich getan habe, ist auf eine bestehende datenstruktur mit einer abfrage versucht, eine liga-tabelle aufzustellen. ob das gelungen ist, wissen wir ja noch gar nicht. aber das war der ausgangspunkt, zudem du davon gesprochen hast, dass genau das nicht geht. vielleicht sollten wir erst mal abwarten, bis er es ausprobiert und dann diesen ersten schritt bewerten. danach können wir uns gerne zwei funktionierede ansätze miteinander vergleichen. aber soweit sind wir noch gar nicht. stellt sich mein ansatz als falsch heraus, dann fehlt auch jede grundlage über vor und nachteiel zu argumentieren.

                  Krass ausgedrückt: Bei "deiner" Struktur (jaja, hast du dir nicht ausgedacht, sondern nur abgefragt) muß man die gesamte Applikation vor der Datenbank umstricken, und es es nur, um eine feste Abfrage "IF saison = 2003 AND verein = kaiserslautern then punkte = punkte - 3" einzuprogrammieren.

                  nein, dass mus man nicht. ein drei punkte abzug vor der saison ist ja eher eine ausnahme in der bisherigen bundesligageschichte und weniger die regel. man kann die drei punkte für die entsprechende mannchaft und saison auch ganz einfach mit in die abfrage mit reinbringen. dann braucht man an der datenstruktur nichts zu verändern, nicht mal einen weiteren datensatz einfügen.

                  Ilja

                  1. also, ich habe ein wenig das gefühl, du bringst einen vergleich an, der gar nicht zur diskussion steht. ob dein ansatz besser oder schlechter ist, darüber diskutiert hier keiner ausser dir. niemand hat wertungen reingebracht.

                    Mal unabhängig davon wie die Diskussion ausgeht ;-)

                    Da ich ja ein gleiches Problem habe, finde ich diese sehr fruchtbar. Der eine weg von dir, auf diese Struktur aufzubauen und mit einer (für mich) komplizierten abfrage (evtl.) zu einem Ergebnis zu kommen sieht für einen (Halb)-Laien sehr interessant aus, während der von Sven etwas mehr Gehirnschmalz bei der DB Struktur erfordert. Ich werd mir auf jeden Fall die Vorschläge hier merken und wenn ich dann mal wieder soweit bin (hab grad mal wieder bei null angefangen, da es immer Verbesserungen gibt), werde ich dann mal von dem Ergebnis berichten. Falls es hier keines gibt.

                    Auf jeden Fall habe ich mittlerweile das Gefühl, dass es zumindest geht per mySQL Abfrage die Daten schon soweit aufzubereiten.

                    schon mal vielen Dank von meiner Seite, mir hat die Diskussion bisher geholfen.

                    Struppi.

    2. Jedoch bin ich zwar Anfänger in MySQL das heisst aber nicht, dass ich keine Ahnung von relationalen Datenbanken habe, oder?

      • Oder gar die Logik nicht verstehe!

      Ich denke mal, dass ich auf einem ähnlichen stand bin wie du und ebenfalls mit diesem Problem schon gekämpft hatte (ich bekam auch schon damals Tipps von sven, soweit ich mich erinnere).

      Mannschaft(man_nr,ver_nr,altkl_nr,man_t,man_sp_t,man_sp_z)

      Spiel(sp_nr,sai_nr,sp_heim,sp_gast,sp_h_t,sp_g_t,<<6 Spalten für Karten>>,sp_date,sp_time)

      Die Probleme sind:

      um die Tabelle dierekt aus der DB abfragen zu können, müßtest du in dieser Form 2 Abfragen integrieren, da ja die gleiche Mannschaft sowohl heim- als auch die gast Mannschaft sein kann (das war damals meine Frage, ob ich ein group by auf zwei Felder anwenden kann, was nicht geht).

      Insofern ist der Ansatz von Sven nicht schlecht (also 2 Datensätze pro Spiel, aber nur eine spalte für die Mannschaft), er hat aber einen Nachteil den ich zumindest nicht gelöst bekam. Du hast Schwierigkeiten die Spiele aus der DB rauszuholen. Zumindest, wenn du nicht mit einem Feld 'spieltag' arbeitest, da du mit LIMIT Probleme hast, wenn du immer 2 Sätze für ein Spiel brauchst.

      Soweit zu meinen Erkenntnissen. Ich lese diesen Thread auch sehr genau mit, da ich dieses Problem für mich ebenfalls noch nicht gelöst habe (ich habe das redesign um ein Jahr verschoben um nochmal gründlich alles zu analysieren) und hoffe endlich mal eine endgültige Lösung zu finden.

      Struppi.

      1. Moin!

        Insofern ist der Ansatz von Sven nicht schlecht (also 2 Datensätze pro Spiel, aber nur eine spalte für die Mannschaft), er hat aber einen Nachteil den ich zumindest nicht gelöst bekam. Du hast Schwierigkeiten die Spiele aus der DB rauszuholen. Zumindest, wenn du nicht mit einem Feld 'spieltag' arbeitest, da du mit LIMIT Probleme hast, wenn du immer 2 Sätze für ein Spiel brauchst.

        So, Schwierigkeiten? Das wundert mich jetzt aber.

        Du hast eine Tabelle mit den Spielen. Jedes Spiel ist (z.B. mit Datum) eingetragen. Und es gibt zwei Felder für Heim und Gast als Referenz auf die Ergebnistabelle. Du bist also gezwungen, zweimal JOIN zu machen, um ein Spielergebnis zu erhalten - die dabei entstehende Tabelle listet aber trotzdem jedes Spiel nur einmal und kann auch mit LIMIT bearbeitet werden. Es sei denn, du hast Fragen an die DB, die diese schlecht beantworten kann. :)

        - Sven Rautenberg

        1. So, Schwierigkeiten? Das wundert mich jetzt aber.

          Mag sein, dass ich den Ansatz damals nicht kapiert hatte und mit join noch nicht soviel angangen konnte (wie gesagt ich schrieb ja, bisher nich lösen konnte)

          Du hast eine Tabelle mit den Spielen. Jedes Spiel ist (z.B. mit Datum) eingetragen. Und es gibt zwei Felder für Heim und Gast als Referenz auf die Ergebnistabelle. Du bist also gezwungen, zweimal JOIN zu machen, um ein Spielergebnis zu erhalten - die dabei entstehende Tabelle listet aber trotzdem jedes Spiel nur einmal und kann auch mit LIMIT bearbeitet werden. Es sei denn, du hast Fragen an die DB, die diese schlecht beantworten kann. :)

          Ich bin nach wie vor an dem Problem und werde mir dieses hinter die Ohren schrieben ;-)

          ehrlich gesagt ich komm jetzt grad nicht drauf, warum ich Schwierigkeiten mit deinem Ansatz hatte, das klingt alles so logisch.

          Ich glaub DB sind nicht meine Stärke.

          Struppi.

  5. Hallo dolito,

    ich verfolge deinen Thread aufmerksam, da ich so was Ähnliches auch schon mal angegangen bin.

    Meine Frage an dich oder die anderen hier:

    Punkte(3 für Sieg, 1 für Unentsch., 0 für Niederlage)
    Tordifferenz
    geschossene Tore

    Schaffe ich das mit einer einzigen, "reinen" SQL-Abfrage?

    Warum muss/darf die Ergebnistabelle aus _nur_ einer einzigen SQL-Abfrage erstellt werden?

    Vorteile/Nachteile?

    Grüsse
    Frankie

    1. Hi Frankie

      Warum muss/darf die Ergebnistabelle aus _nur_ einer einzigen SQL-Abfrage erstellt werden?

      Vorteile/Nachteile?

      Da ich erst am erlernen der SQL Syntax bin wollte ich hier vielleicht einiges mitnehmen.

      Ich denke/schätze mal das es auch einen Geschwindigkeitsvorteil bringt gegenüber einem Script.

      Wenn ich mein Design mal ändere, was nächste Saison auf jeden Fall eintreten wird (Spieler, Schiedsrichter, Verbände,usw), dann muss ich nur eine einzige Abfrage ändern und nicht das ganze Script!

      mfg dolito