Crytec: &SQL: Wie kann ich ausgaben über mehrere seiten verteilen

Mir ist bekannt dass ich eine ausgabe über LIMIT x,x natürlich über mehrere Seiten verteilen kann... aber wie mache ich es bei sonder-selektionen?

Sprich:

SELECT * FROM X WHERE id ='Y'

er selecttiert nun goldende

1. Käse__ Id X
2. Kuchen ID Y <selektiert
3. Banane ID Z
4. Torte_ ID Y <selektiert
5. Apfel_ ID Z

//Kommentar: x=milchprodukt y=backware z=frucht

Nun kann ich aber ja ncihtmehr sagen limi 1,10 da ja nicht jeder wert genommen wurde...

eine idee?

ciao

  1. Hi,

    Nun kann ich aber ja ncihtmehr sagen limi 1,10 da ja nicht jeder wert genommen wurde...

    Das müsste auch so gehen. Er sortiert nicht nach ID sondern nach den die du selektest. Hast dus denn schonmal ausprobiert?

    1. Hello,

      Nun kann ich aber ja ncihtmehr sagen limi 1,10 da ja nicht jeder wert genommen wurde...

      Das müsste auch so gehen. Er sortiert nicht nach ID sondern nach den die du selektest. Hast dus denn schonmal ausprobiert?

      SIE  numeriert die Trefferliste durch und nutzt offset und limit.

      Es heißt nämlich DIE Datenbank und nicht der Datenbank *ggg*

      Es gab hier die letzten Tage schon einen Thread zu diesem Thema.

      Da eine benutzerspezifische Selektion von Daten i.d.R. nicht in die Bookmarks oder Suchmaschinen aufgenommern werden soll, kann man das Blättern getrost mit einem Formular machen und nicht mit Links. Einemm Formular kann man nun auch Parameter in einem hidden-feld mitgeben.

      Je nachdem, wie dynamisch der Datenbestand im Filterbereich ist, sollte man die Strategie dann auch wählen. Man kann die Suche zum Suchzeitpunkt komplett durchführen und sich die IDs des Ergebnisses merken (Snapshot) oder man kannn die Suche auf jeder Seite wiederholden lassen und nur eine Verschiebung (offest) des Aufsetzpunktes in der Ergebnisliste durchführen. Dabei sollte man aber nicht vergessen, dass man bei der dynamischen Suche jedesmal eine andere Ergebnisliste bekommt und so je nach Veränderung des Datenbestandes, dem Filter und der Sortierung dabei ein ganz unergonomisches Programmverhalten herauskommen kann.

      Wenn die Ergebnismenge der Suche also nicht zu groß ist, würde ich immer die IDs in einem Set in einer Session speichern oder und z.B. Base64-codiert in einem Hidden-Feld an den Client mit ausliefern. Beim Vor oder zurückblättern wird dieses Set dann benutzt, um auf dem Server die passende Seite bereitzustellen. Man schneidet einfach ein Stück von dem Set raus und führt das Select damit durch

      select <fields> from <table> where ID in (<subset>)

      $set=(10,15,20,55,99,1013,199,7005789)
              --------
              seite 1  ----------
                        seite 2   -----------
                                   seite 3

      Ich suche dafür allerdings immer noch nach einer Möglichkeit der Drehung der Daten um 90°...

      also aus:

      1
              2
              3
             ...

      mache   1, 2, 3, ...

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hi

        select <fields> from <table> where ID in (<subset>)

        $set=(10,15,20,55,99,1013,199,7005789)
                --------
                seite 1  ----------
                          seite 2   -----------
                                     seite 3

        ab hier verstehe ich es nichtmehr... wie weist du SEITE 1, SEITE 2... etc den werten dort zu?

        Ich suche dafür allerdings immer noch nach einer Möglichkeit der Drehung der Daten um 90°...

        *lacht*
        Kannst sie ja als Grafik schreiben... und drehen.. und durch einen Reader das Bild wieder in werte zurückgeben lassen =)
        Was natürlich unsinn wäre =)

        ciao

        1. yo,

          du arbeitest weiter mit dem limit nur dass du in der WHERE klausel bei der abfrage eine weitere bedingungen mit rein nimmst und zwar so, dass nur die id-werte der ausgewählten datensätze mit in die ergebnistabelle gelangen.

          SELECT ....
          FROM ....
          WHERE ....
          AND id IN (hier die liste der ausgewählten ID's durch komma getrennt)
          LIMIT x, 10

          Ilja

          1. Hello Ilja,

            du arbeitest weiter mit dem limit nur dass du in der WHERE klausel bei der abfrage eine weitere bedingungen mit rein nimmst und zwar so, dass nur die id-werte der ausgewählten datensätze mit in die ergebnistabelle gelangen.

            SELECT ....
            FROM ....
            WHERE ....
            AND id IN (hier die liste der ausgewählten ID's durch komma getrennt)
            LIMIT x, 10

            Das ist ja irgendwie eine geniale Idee, insbesondere, wenn die IDs sowieso auf dem Server in der Session liegen...
            Jetzt müsste man das erste Select nur noch sofort in eine solche Liste packen können, anstatt es in einem Resultset als Zeilenelement zu bekommen. Hast Du da auch noch eine Idee?

            Ich prokel hier schon ne Weile mit select into outfile rum. Das ist aber keine Lösung für den "Normal-Webmaster", weil der meistens keinen Zugriff auf die MySQL-Verzeichnisse hat bzw. die ini verschrauben kann.

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Das ist ja irgendwie eine geniale Idee, insbesondere, wenn die IDs sowieso auf dem Server in der Session liegen...

              Ich versteh kaum noch ein wort =/

              HAt jemand mal ein konkretes codebeispiel.... welches ich nehmen knn und das geht.. und ich daran so lange schieben kann bis es auf meine anforderungen passt?

              ciao

              1. yo,

                HAt jemand mal ein konkretes codebeispiel.... welches ich nehmen knn und das geht.. und ich daran so lange schieben kann bis es auf meine anforderungen passt?

                wie gesagt, bleibe bei deinem LIMIT und packe es zusammen mit der WHERE Klausel, da es sich immer nur auf die ergebnistabelle bezieht. wenn in deinem falle die selektion über das "Y" erfolgt und nicht über einzelne id's, dann...

                SELECT * FROM X WHERE id ='Y' LIMIT x,y;

                Ilja

            2. yo,

              Hast Du da auch noch eine Idee?

              um ehrlich zu sein, mir ist noch nicht ganz klar, was deine ausgangssituation ist und was du erreichen willst....

              Ilja

        2. Hello,

          select <fields> from <table> where ID in (<subset>)

          $set=(10,15,20,55,99,1013,199,7005789)
                  --------
                  seite 1  ----------
                            seite 2   -----------
                                       seite 3

          ab hier verstehe ich es nichtmehr... wie weist du SEITE 1, SEITE 2... etc den werten dort zu?

          Das mache ich nach gutdünken.
          Angenommen, man hat nicht 8 IDs ermittelt mit der Abfrage, sondern 132, dann stehen die eben der Reihe nach, so wie die Sortierung es vorschrieb, in diesem Set. Und nun entscheide ich mich, immer 9 Datensätze auf einer Seite anzuzeigen. Wie könnte ich denn über einen Index auf diese IDs zugreifen?

          PHP bietet für diese Dinge leistungsstarke Array-Funktionen. Man könnte also das Set in ein Array übertragen (wenn es da nicht schon drin steht) und dann mit array_slice() einen Teil rausschneiden
          http://de3.php.net/manual/de/function.array-slice.php

          $_subset = array_slice($_set,($page-1)*$anzahl,$anzahl);
            $subset = implode(',',$_subset);

          $sql =  "select $fieldset from $tabelle where ID_$tabelle in ($subset)";

          und Schuss!

          Man könnte sich natürlich auch Stringfunktionen selber basteln. MySQL bietet solche Funktionen bereits (fast) fertig. Man zählt einfach die Kommata und schneidet das Stück raus.

          -----------------

          Ich suche dafür allerdings immer noch nach einer Möglichkeit der Drehung der Daten um 90°...

          *lacht*
          Kannst sie ja als Grafik schreiben... und drehen.. und durch einen Reader das Bild wieder in werte zurückgeben lassen =)
          Was natürlich unsinn wäre =)

          Ja, wenn vertikale Daten damit korizontal werden?

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau