DISTINCT und MAX kombinieren?

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

  • DISTINCT und MAX kombinieren?

    Hi

    Ich habe eine Tabelle mit mehreren Feldern. Die wichtigen sind FixS (varchar) ind time (int, phptimestamp time())

    Nun möchte ich gerne alle Einträge aus dieser Tabelle auslesen, jedoch nur immer einen wo FixS gleich ist, und time der höchste wert ist.

    Wie mache ich das am bessten? Kann ich sowas machen, und wenn ja gibt es was besseres oder wäre dies ok SELECT DISTINCT(FixS), MAX(time)

    Danke schonmal für eure Tipps.

    Gruss

    Olli

  • #2
    Nein, GROUP BY + HAVING COUNT sind deine Freunde.

    Kommentar


    • #3
      Hi

      Danke dir. Ich kann leider noch nicht testen. Hab mir nun mal durchgelesen was das genau ist. Würde denn diese Abfrage funktionieren wie ich das möchte?

      SELECT FixS, time
      FROM TestTabelle
      GROUP BY FixS <--- Damit immer nur ein Eintrag ausgegeben wird mit dem Wert aus FixS und nicht alle Einträge wo FixS gleich ist
      HAVING COUNT(time) <--- Damit der Eintrag genommen wird wo time am höchsten ist.

      Danke schonmal.

      Gruss

      Olli

      Kommentar


      • #4
        Nein. Du möchtest:

        1. den höchten Wert von Time => max(time) ist die Lösung
        2. wo Werte in FixS mehr als einmal vor kommt => Count(FixS) >1

        => select FixS, max(time) As maxtime from ... group by FixS having count(FixS)>1

        Kommentar


        • #5
          Danke dir

          Da hab ich wohl was falsch verstanden gehabt sorry.

          Gruss

          Olli

          Kommentar


          • #6
            Hi

            Ich konnte es nun testen. Funktioniert leider nicht so ganz.

            Das mit GROUP BY hat geklappt. Ich bekomme jeweils nur einen datensatz wo dieses Feld FixS gleich ist.

            Das HAVING habe ich mal weggelassen. Ich glaube ich habe mich da blöd ausgedruckt.

            Das Problem ist wenn ich das mit MAX(time) mache und GROUP BY. Wird aus irgend einem Grund nicht der eintrag genommen wo die grösste Zeit drin ist, sondern einfach das feld wo er das erstemal den wert von FixS findet. Habe es auch am ende mit ORDER BY time DESC probiert. Jedoch ohne erfolg

            Hast du da noch eine Idee? Habe bisher leider noch kein Fehler ausfindig machen können.

            Gruss

            Olli
            Zuletzt geändert von Olli4; 16.10.2008, 14:44.

            Kommentar


            • #7
              Wie sieht deine aktuelle Abfrage aus?

              Kommentar


              • #8
                Hi

                Ups. Sorry habe ich vergessen zu schreiben:
                Probiert habe ich folgendes:
                SELECT FixS, max(time) AS maxtime
                FROM TestTabelle
                GROUP BY FixS
                und
                SELECT FixS, max(time) AS maxtime
                FROM TestTabelle
                GROUP BY FixS
                ORDER BY time DESC

                Wenn ich HAVING COUNT verwende, gibt er mir nur noch die einträge aus wo er merere einträge von FixS findet. Er soll mir jedoch auch die einzelnen ausgeben. Daher habe ich dies weggelassen.

                Gruss

                Olli

                Kommentar


                • #9
                  ORDER by maxtime ist richtiger!

                  Frage: wasfür einen Typ ist die Spalte time? Und wie sehen die Werte darin aus?

                  Kommentar


                  • #10
                    time ist INT(11) und beinhaltet den timestamp den PHP mittels time() generiert. also z.B. 1224160093.

                    Bei mir hat ORDER BY time DESC nur die auswirkung in der Sortierung nachher in der while schleife von PHP.
                    Also er Ordnen die gesamte ausgabe das im WHILE zuerst der Datensatz mit der neusten oder ältesten Zeit kommt. Jedoch nicht welchen Datensatz wo FixS gleich ist er nimmt.

                    Gruss

                    Olli

                    Kommentar


                    • #11
                      Ich habe nun folgendes gemacht, was funktionieren würde:
                      Code:
                      SELECT t.FixS, max(t.time) AS maxtime
                      FROM TestTabelle t
                      WHERE time = (
                        SELECT MAX(time) FROM TestTabelle WHERE FixS = t.FixS GROUP BY FixS
                      )
                      GROUP BY t.FixS
                      ORDER BY t.time DESC
                      Die frage wäre jedoch nun ob dies sinn macht, oder ob ich hier schrott produziert habe.

                      Gruss

                      Olli

                      EDIT: Sorry für den Doppelpost.
                      Zuletzt geändert von Olli4; 16.10.2008, 18:03.

                      Kommentar


                      • #12
                        Das ist unfug und warum sortierst du nach etwas, was du nicht bekommst?

                        SELECT FixS, max(time) AS maxtime
                        FROM TestTabelle
                        GROUP BY FixS
                        ORDER BY maxtime DESC

                        reicht völlig aus.

                        Kommentar


                        • #13
                          Hi

                          Jetzt habe ich langsam raus warum es für mich nicht stimmt. Ggf habe ich mich auch blöd ausgedruckt.
                          Er gibt mir mit deiner Lösung wirklich die höchste Zeit. Jedoch nicht ganz wie erhoft. Er gibt mir time = höchster wert. Jedoch nimmt er alle anderen felder die ich mit dieser SELECT abfrage auslese den ersten vorkommenden. Sogar wenn ichs direkt in phpmyadmin ausführe.

                          Gibt es denn eine Möglichkeit den spies so umzudrehen, das er mir nicht die höchste Zeit ausliest, sondern den gesamten DB Eintrag wo die höchste Zeit drin ist?

                          Sorry das ichs was falsch beschrieben habe.

                          Danke schonmal.

                          Gruss

                          Olli

                          Kommentar


                          • #14
                            Code:
                            SELECT t.*
                            FROM ( SELECT FixS, MAX(time) AS time FROM TestTabelle GROUP BY FixS ) m
                            INNER JOIN TestTabelle t USING ( FixS, time )
                            Zuletzt geändert von h3ll; 16.10.2008, 22:22.

                            Kommentar


                            • #15
                              Seufz, warum liest du meine Antwort nicht: http://www.php-resource.de/forum/sho...800#post601800

                              Kommentar

                              Lädt...
                              X