abfrage: die letzten 10 aber asc

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

  • abfrage: die letzten 10 aber asc

    hallo,

    sieht wie ein kleines problem aus, aber ich finde im internet nichts dazu.
    angenommen, ich habe 15 datensätze und jeden tag kommen 3 neue dazu.
    nun möchte ich eine abfrage haben, die die letzten 5 datensätze anzeigt, aber nicht desc, sondern asc sortiert :

    13
    14
    15
    16
    17

    ich finde aber nur abfragen, die entweder 1,2,3,4,5 oder
    17
    16
    15
    14
    13 ausspucken.

    geht es nicht, so wie ich denke ?

    viele grüße, skys

  • #2
    wenn dein dbms mit subselect umgehen kannst dann:

    select n.a, n.b, n.c from (select a, b, c from xyz order by a desc limit 5) n order by n.a asc

    Kommentar


    • #3
      Dazu legst du dir am besten in deiner Tabelle ein Feld timestamp an das du beim einlesen der Daten mit aktuellen timestamps fütterst.

      Der SQL Query sieht dann etwa so aus:

      PHP-Code:
      SELECT `spalteA`, `spalteBFROM `tabelleORDER BY `timestampASC 

      Kommentar


      • #4
        hallo,

        und danke euch beiden für die antworten.

        @asp2php
        es wäre eine sql-db, aber keine ahnung, ob sie mit subselect umgehen könnte.
        da es aber auch nur um eine einfache abfrage geht à la
        $abf = "SELECT aa, bb, cc FROM tabelle";
        habe ich da im moment noch keine idee, wie ich ein sinnvolles subselect bauen könnte. oder übersehe ich etwas ?
        ausprobiert hatte ich bisher verschiedene möglichkeiten mit LIMIT, ORDER BY und eben ASC/DESC, wie zb :
        $abf = "SELECT aa, bb, cc, zeit FROM tabelle ORDER BY zeit DESC LIMIT 7";

        @wentz
        ich habe ein (ich denke mal timestamp) feld namens aufgabedatum, dort wird die zeit gespeichert, wann man den datensatz abspeichert.
        aber auch hier hätte ich bei deinem abfragebeispiel :
        SELECT `spalteA`, `spalteB` FROM `tabelle` ORDER BY `timestamp` ASC
        das problem, daß nirgends das limit von nur zb 5 datensätzen steht.

        $abf = "SELECT aa, bb, zeit FROM tabelle ORDER BY `zeit` ASC LIMIT 5";
        sortiert wieder nur die ersten 5 asc und nicht die letzten.

        ordnen und limit setzen geht nur, solange ich beides separat habe bzw nicht so kombiniere wie ich will.

        viele grüße, skys

        Kommentar


        • #5
          Es gibt wohl mehrere Wege.

          Hier mal ein möglicher:

          PHP-Code:
          //erstmal Zählen wir deine Datensätze 

          $q=mysql_query("select count($spalte) from $tabelle"); 

          list(
          $anz) = mysql_fetch_array($q);

          //die anzahl haben wir nun in $anz 

          $limit $anz 5


          mysql_query("SELECT a,b,c FROM `tabelle` ORDER BY `timestamp` ASC LIMIT $limit$anz");

          //Jetzt müsstest du die letzten 5 Datensätze sortiert nach ASC bekommen. Wenn du die letzten 10 möchtest änderst du die 5 in 10 
          MFG
          Zuletzt geändert von wentz; 18.02.2008, 01:32.

          Kommentar


          • #6
            @wentz: lese die Frage, wenn du sie verstehtst, dann wirst du sehen, dass deine Lösung Schrott ist.

            Er will die 5 aktuellsten Datensätze aber asc sortiert!

            @skys, liest du meine Antwort nicht? Oder du sollst vielleicht zum Augenarzt gehen

            Kommentar


            • #7
              Schrott ist meine Lösung keines wegs mit etwas überlegen sollte er daraus auch die ersten 5 oder 10 Selectieren können!

              Kommentar


              • #8
                Original geschrieben von skys

                habe ich da im moment noch keine idee, wie ich ein sinnvolles subselect bauen könnte. oder übersehe ich etwas ?
                Z.B. etwa so:
                PHP-Code:
                SELECT 
                    attr_1

                    
                attr_2,
                            ... 
                FROM 
                    tabelle a
                WHERE
                    a
                .attr_x IN(
                        
                SELECT 
                            b
                .attr_x
                        FROM
                            tabelle b
                        ORDER BY
                            b
                .attr_x DESC
                        LIMIT 5
                )
                ORDER BY
                    a
                .attr_x ASC 
                Gruss
                H2O

                Kommentar


                • #9
                  asp2php hat die Lösung doch schon gepostet!
                  @asp2php: Vielleicht die Code-Tags nachfügen, irgendwie überließt jeder deine Query!

                  Kommentar


                  • #10
                    hallo,

                    @asp2php
                    ich lese deine antwort - aber wie du meiner antwort darauf vielleicht entnehmen konntest, half sie mir nicht ausreichend weiter.

                    @H2O
                    vielen dank erstmal - aber ohne konkretes beispiel scheine ich da nicht weiter zu kommen, da ich mir sonst einfach nicht vorstellen kann, was die unterschiede zwischen attr_1, a.attr_x, b.attr_x, etc sein sollen.

                    hätte ich gelbe, rote und grüne paprika, könnte ich mir etwas zurechtdenken.
                    aber bei ktonr, name, betrag erkenne ich keine zusätzlichen atrribute, nach denen ich diese unterteilen könnte.

                    @ wentz
                    ich wollte dein bsp mal ausprobieren, leider erhalte ich aber nur die tabellenüberschriften und keine auflistung - bzw im moment eine weiße seite

                    PHP-Code:
                    <?php
                    include("incl.php");

                    $q=mysql_query("select count($id) from $tab");
                    list(
                    $anz) = mysql_fetch_array($q);

                    $limit $anz 2;
                    $erl mysql_query("SELECT ktonr, name, zeit FROM `tab` ORDER BY `zeit` ASC LIMIT $limit$anz");

                    echo 
                    "$anz";
                    echo 
                    "$limit";
                    ?>

                    <div align="center"><b>Tablala</b></div>
                    <br>

                    <table width="100%">
                    <tr>
                     <td width="20%">KtoNr</td>
                     <td width="60%">Name</td>
                     <td width="60%">Zeit</td>
                    </tr>
                    </table>
                    <hr noshade size="1">

                    <?php
                    while ($row mysql_fetch_object($erl))
                    {
                    ?>

                    <table width="100%">
                    <tr>
                     <td width="20%">
                     <?php
                     
                    echo $row->ktonr;
                     
                    ?>
                     </td>
                     <td width="60%">
                     <?php
                     
                    echo $row->name;
                     
                    ?>
                     </td>
                     <td width="20%">
                     <?php
                     
                    echo date("d.m.Y - H:i a"$row->zeit);
                     
                    ?>
                     </td>
                    </tr>
                    </table>

                    <?php
                    }
                    @
                    mysql_close($connect);
                    ?>
                    kann jemand sehen, wo ich den fehler eingebaut habe ?

                    viele grüße, skys
                    Zuletzt geändert von skys; 19.02.2008, 02:12.

                    Kommentar


                    • #11
                      Original geschrieben von skys
                      h- aber ohne konkretes beispiel scheine ich da nicht weiter zu kommen
                      Viel konkreter kann das Beispiel gar nicht sein, ohne dass wir deine Datenstruktur und insbesondere dein Primary Key kennen. Aber scheinbar hast du dich auch nicht sehr mit SQL befasst. Ein Anhaltspunkt bietet höchstens der Code, den du jetzt gepostet hast. Wenn du unbedingt zwei Abfragen machen willst, dann tu das. Andernfalls wäre der folgende Code etwas konkreter, falls name der Key sein sollte:
                      PHP-Code:
                      SELECT 
                          a
                      .ktonr
                          
                      a.name,
                          
                      a.zeit
                      FROM 
                          tab a
                      WHERE
                          a
                      .name IN(
                              
                      SELECT 
                                  b
                      .name
                              FROM
                                  tab b
                              ORDER BY
                                  b
                      .zeit DESC
                              LIMIT 5
                      )
                      ORDER BY
                          a
                      .zeit ASC 
                      Genauso einfach liesse sich auch das Beispiel von asp2php (das ich nicht übersehen habe) anpassen.
                      Aber wie gesagt, ohne genaue Informationen keine genaue Antwort.
                      Gruss
                      H2O

                      Kommentar


                      • #12
                        hallo H2O,

                        danke für dein beispiel ! doch, das hat mir sehr geholfen, denn daraus erkenne ich, wofür n, n.a, a etc stehen. das hatte ich bei asp2php leider nicht verstanden :

                        select n.a, n.b, n.c from (select a, b, c from xyz order by a desc limit 5) n order by n.a asc
                        ich denke, dann müßte das stimmen, sofern
                        - tabelle a = tabmitgl
                        - tabelle b = tabanzeig
                        - die felder id, name, ktonr und zeit heißen
                        - und ganz simple die id der primärschlüssel wäre :
                        SELECT tabmitgl.id, tabmitgl.name, tabmitgl.ktonr, tabmitgl.zeit
                        FROM tabmitgl
                        WHERE tabmitgl.id IN ( SELECT tabanzeig.id
                        FROM tabanzeig ORDER BY tabanzeig.zeit DESC LIMIT 5 )
                        ORDER BY tabmitgl.zeit ASC
                        damit werde ich mal experimentieren, danke

                        (in dem code bzgl wentz' beispiel sind aber auch noch fehler oder ?)

                        viele grüße, skys

                        Kommentar


                        • #13
                          Ich würde vermuten, das asp2php`s Lösung die performantere ist. Hast du mal beide ausprobiert?

                          Kommentar


                          • #14
                            Ich denke schon, bzw. ich weiss gar nicht was ihr da macht. An ne Anzahl von Datensätzen kömm ich auch einfacher ..

                            PHP-Code:
                              $SQL "SELECT count(*) FROM table.name WHERE anweisung1 = anweisung2";
                              
                            $Result mysql_query($SQL);
                              
                            $ResultSet mysql_fetch_assoc($Result);
                              echo 
                            $ResultSet[0];     // Gibt die Anzahl aller Datensätze aus
                              
                            echo $ResultSet[0]-5// Gibt die Anzahl aller Datensätze -5 aus 
                            wenn man nun "echo" durch $var = ersetzt, hat man das gleich wie bei dir oben. Ich finde es einfacher, was aber natürlich wiedermal geschmackssache ist.

                            Kommentar


                            • #15
                              Nein, hier zählt niemand, nur wentz macht das. Es geht darum, die 5 letzten Datensätze nicht desc sondern asc sortiert auszugeben. Genau das macht die Query von asp2php und von H2O.

                              Kommentar

                              Lädt...
                              X