Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Tabelle auswerten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Tabelle auswerten

    Hallo,

    bin Anfänger was php und sqlite angeht. Deshalb habe ich auch ein Problem, welches ich nicht gelöst bekomme:

    Ich habe aus einer Tabelle Summen erzeugt und diese entsprechend meinen Wünschen Gruppiert und Sortiert.

    Code:
    $Result = sqlite_query("SELECT Jahr, Monat, Tag, sum(spieler1) as sum1, sum(spieler2) as sum2, sum(spieler3) as sum3, sum(spieler4) as sum4 FROM Dominion group by Jahr, Monat, Tag order by Jahr DESC, Monat DESC, Tag DESC", $Database);
    Das Ergebnis sieht in etwa so aus:

    Code:
    20.06.2010  (4) (3) (2) (4)
    19.06.2010 (3) (7) (5) (4)
    19.06.2009 (1) (1) (2) (3)
    Nun aber zu meiner Frage: An jedem Tag sollen Punkte vergeben werden (0-3). Der letzte bekommt 0 und der erste bekommt 3. Wenn zwei Gleichstand haben sollen beide die entsprechenden Punkte erhalten (z. B. 3 Punkte).

    Vielleicht könnte mir jemand einen Hinweis geben, damit ich mein Problem gelöst bekomme. Habe schon über Array bzw. Multiarrays nachgedacht, jedoch bin ich dort auch nicht weiter gekommen.


  • #2
    Die Tabelle domino sollte zuerst normalisiert werden, dann geht es mit der Auswertung "etwas" leichter.

    Also in etwa so...
    Code:
    CREATE TABLE domino (
     id INT NOT NULL,
     datum DATE NOT NULL,   -- anstatt jahr, monat, tag
     spieler_id INT NOT NULL, -- anstatt spieler1, spieler2, ...
     punkte INT NOT NULL, -- ?? punkte ??
     
     PRIMARY KEY (id)
    );
    Ich habe mal die Spalte "Punkte" ergänzt. Bin mir aber nicht sicher, ob diese notwendig ist.

    Grüße
    Thomas

    Kommentar


    • #3
      Hallo,

      danke für die schnelle Antwort.
      Was soll mir das bringen, wenn ich die Tabelle anders aufbaue? Das Datumsfeld hätte dann auch immer die Uhrzeit dabei. Diese benötige ich aber nicht. Ich brauche nur das Datum.
      Ich sehe es so, dass ich dann die gleichen Daten in der Tabelle habe wie jetzt auch, oder?

      Es kann vorkommen, dass an einem Tag mehrere Spiele statt finden. Diese sollen einzeln und gruppiert ausgegeben werden. Anschließend noch gruppiert pro Monat. Deswegen habe ich auch die Felder Tag, Monat und Jahr genommen, damit ich die Abfrage besser gestalten kann. Oder bin ich auf einem Holzweg?

      Kommentar


      • #4
        Eine Spalte vom Typ DATE hat für gewöhnlich keinen Zeitanteil, wahrscheinlich meinst Du TIMESTAMP oder ähnliches, so eine Spalte enthält dann Datum und Zeit.

        Aus einem DATE können Jahr, Monat und Tag extrahiert und genau so gezielt abgefragt werden die bei Deinen drei Spalten Jahr, Monat, Tag. Ein DATE kann nur ein gültiges Datum enthalten, bei drei einzelnen Spalten wird das deutlich schwieriger sicher zu stellen, siehe 29. Feb. etc.

        Zur Normalisierung von Tabellen schaust Du am Besten mal hier bei Wikipedia rein
        Normalisierung (Datenbank) – Wikipedia

        Grüße
        Thomas

        Kommentar


        • #5
          EDIT: Bin glaube auf die Lösung gekommen. Muss es aber erst umsetzen. Hat sich also evtl. schon erledigt.


          Hallo,

          ich habe jetzt mein bestes gegeben. Die Datenbank sieht nun so aus:

          Code:
          CREATE TABLE Dominion
          (
          id INT NOT NULL,
          datum DATE NOT NULL,
          spiel_id INT NOT NULL,
          spieler_id INT NOT NULL,
          punkte INT NOT NULL,
           
          PRIMARY KEY (id)
          );
          Habe also nur noch eine spiel_id dazu gemacht.

          Einen Teil meiner vorherigen Funktionen habe ich auch wieder hin bekommen (sogar mit weniger Zeilen) - Danke.

          Jetzt habe ich ja eine Tabelle, welche in etwa so aussieht (eigentlich 4 spiele, aber hier nur zwei):

          Code:
          Datum       spiel_id  spieler_id  punkte
          2010-06-23  1         1           3
          2010-06-23  1         2           2   - ein Spiel am Tag
          2010-05-22  2         1           2
          2010-05-22  2         2           3
          2010-05-22  2         1           2
          2010-05-22  2         2           3  - zwei Spiele am Tag
          Gibt es eine Möglichkeit eine Abfrage zu erstellen, welche eine Tabelle in der Art

          Code:
          Datum       spiel_id  spieler_id1  spieler_id2
          2010-06-23    1        3            2             (Punkte)
          ...
          erstellt?

          Der Sinn dahinter ist, dass ich mir die Punkte pro Spiel ausgeben lassen möchte. Ansonsten habe ich ja immer pro Spiel 4 Zeilen. Wie soll ich die sonst auslesen können?

          Noch eine andere Frage. Lässt sich so ein Primary-Key in sqlite automatisch erzeugen, ohne dass ich eingreifen müsste?

          Kommentar


          • #6
            Zitat von user13579 Beitrag anzeigen
            Hallo,

            ich habe jetzt mein bestes gegeben. Die Datenbank sieht nun so aus:

            Code:
            CREATE TABLE Dominion
            (
            id INT NOT NULL,
            datum DATE NOT NULL,
            spiel_id INT NOT NULL,
            spieler_id INT NOT NULL,
            punkte INT NOT NULL,
             
            PRIMARY KEY (id)
            );
            Stimmt, sieht gut aus. Nur einen kleinen Hinweis zur Wortwahl:
            Du hast eine "Tabelle" angelegt, nicht eine Datenbank. Eine Datenbank enthält eine bis viele Tabellen.

            Zitat von user13579 Beitrag anzeigen
            Gibt es eine Möglichkeit eine Abfrage zu erstellen, welche eine Tabelle in der Art

            Code:
            Datum       spiel_id  spieler_id1  spieler_id2
            2010-06-23    1        3            2             (Punkte)
            ...
            erstellt?

            Der Sinn dahinter ist, dass ich mir die Punkte pro Spiel ausgeben lassen möchte. Ansonsten habe ich ja immer pro Spiel 4 Zeilen. Wie soll ich die sonst auslesen können?
            Nicht ganz einfach, mit einem GROUP BY bekommt Du die Summen pro Spieler zu einem Spiel. Also ungefähr so. Das Ergebnis musst Du im Programm dann nebeneinander darstellen. Wie wichtig ist diese Darstellung?

            Code:
            SELECT datum, spiel_id, spieler_id, SUM(punkte) AS punkte
             FROM domino
            WHERE spiel_id = 1
            GROUP BY datum, spiel_id, spieler_id
            ORDER BY datum, spiel_id, spieler_id;

            Zitat von user13579 Beitrag anzeigen
            Noch eine andere Frage. Lässt sich so ein Primary-Key in sqlite automatisch erzeugen, ohne dass ich eingreifen müsste?
            Ich kenne SQLITE nicht, schau mal nach SEQUENCE oder AUTOINCREMENT.

            Grüße
            Thomas

            Kommentar


            • #7
              EDIT: Bin glaube auf die Lösung gekommen
              Nicht aber hierfür:
              Nun aber zu meiner Frage: An jedem Tag sollen Punkte vergeben werden (0-3). Der letzte bekommt 0 und der erste bekommt 3. Wenn zwei Gleichstand haben sollen beide die entsprechenden Punkte erhalten (z. B. 3 Punkte).
              Ich denke, das ist auch nicht ganz trivial. Als Tipp: Leg gleich mehr als 2 Datensätze pro Spiel an. 2 ist nämlich ein Sonderfall, bei dem Du nur sortieren musst.
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Habe alles lösen können. Nach dem normalisieren konnte ich teilweise mit verschachtelten while-Abfragen die gewünschten Funktionen implementieren.

                Danke für die Tipps.

                Kommentar

                Lädt...
                X