Ankündigung

Einklappen
Keine Ankündigung bisher.

SELECT MAX(datum) bei mehreren Ausgaben zu diesem Datum

Einklappen

Neue Werbung 2019

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

  • SELECT MAX(datum) bei mehreren Ausgaben zu diesem Datum

    Hallo zusammen,

    ich möchte mir und meiner Freundin gerne ein Trainingstagebuch bauen. Leider hab ich kaum Erfahrung in der Webentwicklung und bin grade erst in den Anfängen mich da
    so ein bisschen einzuarbeiten.
    Für dieses Tagebuch habe ich eine MySQL Tabelle mit folgenden Spalten:
    id datum benutzer uebung satz wiederholung gewicht anstrengung
    1 2017-05-01 user1 uebung1 1 15 50 2
    2 2017-05-01 user1 uebung1 2 15 50 3
    3 2017-05-01 user1 uebung1 3 12 50 4
    4 2017-05-01 user1 uebung2 1 17 20 1
    5 2017-05-01 user1 uebung2 2 15 20 2
    5 2017-05-01 user1 uebung2 3 15 20 3
    5 2017-05-01 user1 uebung2 4 12 20 4
    Der 01.05.2017 ist der 1. Trainingstag von User1. Später soll es noch weitere User geben (damit habe ich mich jedoch noch nicht beschäftigt).
    Angenommen es gibt mehrere User, die ca. 5 Übungen pro Trainingstag haben mit entweder 2,3 oder 4 für Sätzen.

    Wenn ich trainiere möchte ich gerne a) sehen welche Eingaben (über Formulare) ich grade für eine bestimmte Übung gemacht habe und b) möchte ich mir für diese Übung, die Einträge des letzten Trainingtags anzeigen lassen. Also angenommen ich war am 01.05.2017, am 03.05.2017 und am 05.05.2017 trainieren (User2 zwischendurch auch) wie kann ich mir
    a) für Übung 1 die Einträge des letzten Trainingstags anzeigen lassen (also für den 05.05.2017) ?
    b) für Übung 1 die Einträge von vorletzten Trainingstag (vom 03.05.2017) ?

    Aktuell lasse ich mir folgendes ausgeben:
    SELECT satz, gewicht, wiederholungen, datum, id FROM tabelle order by datum desc, satz limit 6

    also eine ganz einfache Ausgabe... immer die letzten 6 Einträge. Also werden bei Übungen mit 3 Sätzen immer die letzten beiden Trainingstage angezeigt.

    Das brauche ich aber in Zukunft anderes weil:
    - ich habe nun auch Übungen mit 2 und mit 4 Sätzen habe
    - ich möchte mir die Ausgabe für den letzten Trainingstag und den vorletzten nun an verschiedenen Orten anzeigen lassen ... nicht mehr direkt hintereinander.

    Ich stelle mir das so vor dass man die Einträge nach jedem Satz quasi live im Fitti in sein Handy einträgt und die Einträge in der Nähe vom Eintragsformular erscheint.
    Wenn man also den 1. Satz von Übung 1 ausgeführt hat trägt man die Ergebnisse ein und sobald der Satz eingetragen und abgesendet ist soll er in der Nähe der
    Eingabeformulare Ausgegeben werden.

    Irgendwo anders soll aber von Anfang bis Ende der Übung der letzte Trainingstag für diese Übung angezeigt werden. Also angenommen man trainiert Garde am 05.05.2017
    dann soll man Satz 1,2 und 3 vom 03.05.2017 sehen, um bei meinem Beispiel von oben zu bleiben.

    Ich hoffe ich konnte mein Vorhaben verständlich schildern.

    Auf meiner Suche nach einer Lösung bin ich an dem Befehl MAX(Datum) vorbeigekommen, weiß allerdings nicht wirklich wie ich den richtig einsetzen kann.
    Meine Idee für a) war folgende:
    SELECT * FROM `kraft`
    where benutzer = 'user1' AND uebung = 'uebung1' AND datum = 'MAX(datum)'
    order by datum desc

    für b) hab ich noch gar keine Idee. Gibt es irgendwie einen Befehl wie MAX(Datum) -1 oder sowas ?

    Nun wird der erfahrene SQL Programmiere sicherlich über mich lachen, da das nicht funktioniert.

    Habt ihr Tips für mich?

    Leider beherrsche ich ... ne falsch ... leider kenne ich nur die SELECT Befehle: WHERE, ORDER BY und LIMIT da das Tutorial welches ich mir durchgelesen habe
    diese als wesentliche Befehle bezeichnet und auch nur diese erklärt hat.

    Erstmal vielen Dank fürs durchlesen meiner Frage !
    Für eure Hilfe wäre ich sehr Dankbar !

  • #2
    Hi,
    Also angenommen ich war am 01.05.2017, am 03.05.2017 und am 05.05.2017 trainieren (User2 zwischendurch auch) wie kann ich mir
    a) für Übung 1 die Einträge des letzten Trainingstags anzeigen lassen (also für den 05.05.2017) ?
    b) für Übung 1 die Einträge von vorletzten Trainingstag (vom 03.05.2017) ?
    Das "schwierige" an diese Anforderung ist, dass das was du dir ansehen willst so willkürlich ist.
    Du kannst Code schreiben der dir für Übung 1 die letzten beiden Trainingstage anzeigt, aber praktischer wäre es imo wenn du stattdessen als User eingibst was du sehen willst.

    Hier könntest du also 2 Datums-Felder, "von" und "bis" und ein Auswahlfeld für die Übung nutzen.

    Es wäre besser wenn du deine Anwendungsfälle mal sauber trennst und aufschreibst. Für mich ist das gerade zu viel durcheinander in deinem Text.

    z.B. könnte es so aussehen:
    - ich brauche alle Übungsdaten des letzten eingetragenen Tages
    - ich brauche alle Übungen in einer Zeitspanne die der User eingeben kann
    - ich brauche Übung X an Tag Y, X und Y können vom User eingegeben werden
    [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
    [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

    Kommentar


    • #3
      ich möchte mir die Ausgabe für den letzten Trainingstag und den vorletzten ... anzeigen lassen
      Heutiges Datum ermitteln:
      SELECT CURDATE()

      Ergebnis
      CURDATE()
      2017-05-22
      Datum von gestern ermitteln:
      SELECT CURDATE()- INTERVAL 1 DAY

      Datum von vorgestern:
      SELECT CURDATE()- INTERVAL 2 DAY

      Datum von morgen:
      SELECT CURDATE()+ INTERVAL 1 DAY
      usw.

      Eingrenzen von Ausgaben auf Datensätze von vorgestern nach obigen Muster:
      SELECT `id`, `Spalte2`, `Datumsfeld` FROM Tabelle WHERE `Datumsfeld` = (CURDATE()- INTERVAL 2 DAY)

      Ich hoffe das hilft dir weiter.
      Handbuch zu Datumsfunktionen

      Kommentar


      • #4
        Vielen Dank für deine Antwort
        Ich muss leider gestehen dass ich noch nicht ganz verstehe was du meinst.

        Zitat von VPh Beitrag anzeigen
        Hi,
        Das "schwierige" an diese Anforderung ist, dass das was du dir ansehen willst so willkürlich ist.
        Was genau meinst du ist willkürlich ? Meinst du dass ich im Prinzip nicht weiß wann ich trainiere und wie viel Tage zwischen letztem Training und aktuellem Training liegen ?
        Das ist ja der Grund warum der Vorschlag von protestix leider nicht wirklich mein Problem löst. Es kann halt sein dass zwischen den Trainingstagen 2,3 oder 4 Tage liegen.
        Trotzdem möchte ich mir das letzte Training für diese Übung anschauen.

        Zitat von VPh Beitrag anzeigen
        Du kannst Code schreiben der dir für Übung 1 die letzten beiden Trainingstage anzeigt, aber praktischer wäre es imo wenn du stattdessen als User eingibst was du sehen willst.
        Das verstehe ich auch nicht ganz. Also wenn ich heute zum Training gehe und mich an das Greät für Übung1 setze und meinen ersten Satz fertigtrainiert habe, dann trage ich
        das Ergebnis über mein Handy ein. (Formulare innerhalb einer .html bzw. .php). Sobald ich auf absenden klicke soll der Eintrag erscheien so das unmittelbar unter den Formularen
        steht:

        Übung 1
        Trainingstag Satz Gewicht in kg Wiederholungen Schwierigkeit
        22.05.2017 1 50 15 2
        Wenn ich Satz 2 eingegeben habe soll das dass so aussehen:
        Trainingstag Satz Gewicht in kg Wiederholungen Schwierigkeit
        22.05.2017 1 50 15 2
        22.05.2017 2 50 15 3
        u.s.w.

        und da drunter oder drüber ... wie auch immer ich das dann designen werde soll schon bevor ich die Übung starte die Einträge des vorherigen Trainingstages
        abgebildet werden. Also:
        Trainingstag Satz Gewicht in kg Wiederholungen Schwierigkeit
        19.05.2017 1 50 15 2
        19.05.2017 2 50 15 3
        19.05.2017 3 50 12 4
        Warum möchte ich das so ? Ich möchte bevor ich an das Gerät gehe wissen wie viel Gewicht ich beim letzten mal hatte, und wie viele Wiederholungen ich
        geschaft habe und wie schwer mir das gefallen ist. Weil das erstens motiviert , da man nicht weniger machen möchte als zuvor und zweitens vergist man manchmal
        einfach ob man z.Bsp. beim letzten mal das Gewicht erhöht hat , oder ob man sich vorgenommen hat das für dieses Training zu tun. Wenn ich vor dem Training
        sehe kann ich mich gut an diesen werten orientieren.

        Zitat von VPh Beitrag anzeigen
        Es wäre besser wenn du deine Anwendungsfälle mal sauber trennst und aufschreibst. Für mich ist das gerade zu viel durcheinander in deinem Text.

        z.B. könnte es so aussehen:
        - ich brauche alle Übungsdaten des letzten eingetragenen Tages
        - ich brauche alle Übungen in einer Zeitspanne die der User eingeben kann
        - ich brauche Übung X an Tag Y, X und Y können vom User eingegeben werden
        Ich schätze ich habe mein Vorhaben nicht gut genug beschrieben ich hoffe ich konnte das jetzt etwas nachschärfen.

        Aber nochmals danke für deine Hilfe , vielleicht kannst du mir jetzt besser weiterhelfen.

        Kommentar


        • #5
          Zitat von protestix Beitrag anzeigen

          Heutiges Datum ermitteln:
          SELECT CURDATE()

          Ergebnis
          CURDATE()
          2017-05-22
          Datum von gestern ermitteln:
          SELECT CURDATE()- INTERVAL 1 DAY

          Datum von vorgestern:
          SELECT CURDATE()- INTERVAL 2 DAY

          Datum von morgen:
          SELECT CURDATE()+ INTERVAL 1 DAY
          usw.

          Eingrenzen von Ausgaben auf Datensätze von vorgestern nach obigen Muster:
          SELECT `id`, `Spalte2`, `Datumsfeld` FROM Tabelle WHERE `Datumsfeld` = (CURDATE()- INTERVAL 2 DAY)

          Ich hoffe das hilft dir weiter.
          Handbuch zu Datumsfunktionen
          Auch dir vielen Dank für deine Antwort, wie in der Antwort für VPh bereits erwähnt weiß ich nicht wie lange das letzte Training her ist, das macht die Sache
          nicht leichter Aber CURDATE probiere ich gleich zumindest mal für Teil eins. Die Frage ist dann nur wie lasse ich mir das vorherige Training anzeigen.

          Kannst du mir denn begründen warum where benutzer = 'user1' AND uebung = 'uebung1' AND datum = 'MAX(datum)'
          nicht funktioniert ?

          Kommentar


          • #6
            Weil Max() eine Aggregatfunktion ist.

            Du kannst ein Subselect nehmen
            PHP-Code:
            SELECT row
            FROM table
            WHERE datum
            =(
                
            SELECT max(datum)
                
            FROM table

            Kommentar


            • #7
              Du kannst die Trainingsdaten rein nach Tagen (und user ) selectieren.
              ~select distinct user, trainingdate from mytable
              da kannst Du noch eine fortlaufende Zahl dran kleben (das wird später Dein Abfrageparameter, also
              1= letztes Training = 5.5.
              2= vorletztes Training = 2.5.
              3= drittltetztes Training = 30.4.

              usw.

              In der finalen Abfrage joinst Du obiges Statement über das Datum (und die Usereinschränkung) mit der eigentlich Datenabfrage.
              Das Ergebnis ist sind Deine letzten Trainingdaten, deine vorletzten usw..
              1= letztes, 2= vorletztes usw. kann man dann per webforumlar umsetzen bzw, für den Anfang reichen ja die Button 1-6.

              Kommentar


              • #8
                Nummer drankleben geht so:
                Code:
                 SELECT Row := Row + 1 as row, t.* FROM some_table t, (SELECT Row := 0) r
                https://stackoverflow.com/questions/...uence-in-mysql
                "some_table" musst Du durch das Statement im vorigen Beitrag ersetzen in Klammer ()

                Kommentar


                • #9
                  Zitat von Monjy Beitrag anzeigen
                  Kannst du mir denn begründen warum where benutzer = 'user1' AND uebung = 'uebung1' AND datum = 'MAX(datum)'
                  nicht funktioniert ?
                  Das gibt sql einfach so nicht her, das musst Du Dir selber mal anschauen.
                  Ein Max() verwendet man so in der Select Clause, nicht im Where.

                  Ich habe Dir ein Beispiel für meinen Vorschlag oben gemacht.


                  http://rextester.com/XTZBU26041

                  Kommentar


                  • #10
                    Zitat von Monjy Beitrag anzeigen

                    Kannst du mir denn begründen warum where benutzer = 'user1' AND uebung = 'uebung1' AND datum = 'MAX(datum)'
                    nicht funktioniert ?
                    Where filtert, max() berechnet in den gefilterten Werten. Henne-Ei-Problem in seiner besten Darstellung.
                    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                    Kommentar


                    • #11
                      Zitat von Perry Staltic Beitrag anzeigen
                      Das gibt sql einfach so nicht her, das musst Du Dir selber mal anschauen.
                      Ein Max() verwendet man so in der Select Clause, nicht im Where.

                      Ich habe Dir ein Beispiel für meinen Vorschlag oben gemacht.


                      http://rextester.com/XTZBU26041
                      Wow, du hast dir ja echt viel Arbeit gemacht ! Vielen vielen Dank dafür !

                      Ich muss allerdings gestehen dass ich noch nicht wirklich durchblicke. Wie gesagt habe ich bisher nur mit WHERE, LIMIT und ORDER BY gearbeitet.
                      Daher sieht mir das auf den ersten Blick aus wie ein wilder Zeichen und Buchstabensalat Aber ich versuche mich grade durchzukämpfen.
                      Wenn ich das richtig verstehe ist Row eine Variable ... bisher wusste ich nicht mal das es Variablen in MySQL gibt

                      Ich versuche mich mal Stück für stuck mit freund Google durchzukämpfen und melde mich wenn Fragen offen bleiben. Die Wahrscheinlichkeit
                      ist wohl recht hoch. Vielleicht doch jetzt schon eine , weil das schwer zu googeln ist ... was bedeutet das t bei t.* und das r ?

                      Kommentar


                      • #12
                        Zitat von protestix Beitrag anzeigen
                        Weil Max() eine Aggregatfunktion ist.

                        Du kannst ein Subselect nehmen
                        PHP-Code:
                        SELECT row
                        FROM table
                        WHERE datum
                        =(
                        SELECT max(datum)
                        FROM table

                        So funktioniert Teil eins bestens ... nochmals vielen Dank für deine Hilfe !

                        Kommentar


                        • #13
                          Zitat von Monjy Beitrag anzeigen

                          Vielleicht doch jetzt schon eine , weil das schwer zu googeln ist ... was bedeutet das t bei t.* und das r ?
                          Das nennt sich Table Alias, ein Synonym für die Tabelle oder das Subselect. Es steht für die Tabelle und kann häufig auch 1:1 mit dem Originaltabellennamen ausgetauscht werden.
                          Neben der praktischen Abkürzung des Tabellennamens und der eindeutigen Zuordnung von Feldnamen in Select oder Where Clause ermöglicht es auch die Mehrfachverwendung der selben Tabelle in einem Statement durch verschiedene Aliase.

                          Wenn es noch klemmt, melde Dich ruhig. Mir hat Dein Ansatz gefallen, eine Lösung zu suchen, die praktisch für den Anwender ist und nicht für den Entwickler.
                          Ich habe extra ein paar Zwischenschritte und Kommentare im Beispiel, kann man ja ausprobieren, abändern, ergänzen, um es zu verstehen.

                          Kommentar


                          • #14
                            Zitat von Perry Staltic Beitrag anzeigen
                            Das nennt sich Table Alias, ein Synonym für die Tabelle oder das Subselect. Es steht für die Tabelle und kann häufig auch 1:1 mit dem Originaltabellennamen ausgetauscht werden.
                            Neben der praktischen Abkürzung des Tabellennamens und der eindeutigen Zuordnung von Feldnamen in Select oder Where Clause ermöglicht es auch die Mehrfachverwendung der selben Tabelle in einem Statement durch verschiedene Aliase.

                            Wenn es noch klemmt, melde Dich ruhig. Mir hat Dein Ansatz gefallen, eine Lösung zu suchen, die praktisch für den Anwender ist und nicht für den Entwickler.
                            Ich habe extra ein paar Zwischenschritte und Kommentare im Beispiel, kann man ja ausprobieren, abändern, ergänzen, um es zu verstehen.
                            Werde mich auf jeden Fall noch mit deiner Lösung beschäftigen. Ich denke da ist eine Menge für mich zu lernen.
                            Mein Problem habe ich nun aber etwas anders gelöst, nämlich so:

                            PHP-Code:
                            SELECT FROM `tabelle`
                            Where benutzer'user1l' AND uebung='uebung1' AND datum=(SELECT MAX(datumFROM tabelle where datum<>(SELECT MAX(datumFROM tabelle)) 
                            Also mit ner doppelten Verschachtelung.
                            Spricht etwas gegen diese Lösung ?
                            Sind solche Verschachtelungen ratsam ?

                            Kommentar


                            • #15
                              Da spricht nichts dagegen. Der Größenvergleich mit Max(), also Deine Verschachtelung bildet einen Fall ab.
                              Meine Lösung ist allgemeiner und man kann sie einfach auf eine maximale Menge an Rückgabesätzen beschränken.
                              Ich frage mich allerdings, was das Problem mit meiner Lösung ist. Die Übertragung auf Dein wirkliches Datenmodel vielleicht?

                              Im "echten Leben" kann es bei beiden ggf. zu Performance Problemen kommen, wenn große Datenmengen vorliegen. Wie oft warst Du schon trainieren?
                              Aber man kann das optimieren.

                              Wenn Du Verständnisprobleme hast, nimm Dir jeweils Abschnitte aus dem Beispiel und verändere sie, trag zusätzliche Daten ein usw., tut nicht weh, geht nichts kaputt.
                              Ansonsten frag halt.

                              Kommentar

                              Lädt...
                              X