Ankündigung

Einklappen
Keine Ankündigung bisher.

vorheriger/nächster datensatz

Einklappen

Neue Werbung 2019

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

  • vorheriger/nächster datensatz

    Hallo ich habe ein Problem:
    ich habe eine Select-Anweisung mit zwei where-Bedingungen

    $abfrage = "SELECT * FROM whiskysorten where Kriterium = gut && ID=100

    (PS: Die ID ist eindeutig, so dass in der Abfrage eigentlich redundant und nur zur Verdeutlichung angegeben.)

    wie bekomme ich den vorherigen bzw. nächsten Datensatz zur ID 100 der das Kriterium=gut erfüllt?

    D.h, ich möchte in der Auswahl (Kriterium) einer Tabelle blättern.

    Muss ich hierfür eine Hilfstabelle erstellen oder geht das auch anders?

  • #2
    Zitat von hamburger Beitrag anzeigen
    wie bekomme ich den vorherigen bzw. nächsten Datensatz zur ID 100 der das Kriterium=gut erfüllt?
    In dem du zunächst eine Sortierreihenfolge definierst (derzeit enthält deine Query noch gar keine Sortierung, also gibt es auch noch keinen „vorherigen“ oder „nächsten“ Datensatz!), und dir dann unter zu Hilfe nahme von ORDER BY und LIMIT jeweils nur den einen Datensatz liefern lässt, der innerhalb dieser Sortierung vor/nach dem Vergleichsdatensatz kommt.
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Hallo ChrisB,
      danke für deine schnelle Antwort.
      Bei meiner Abfrage:
      $abfrage = "SELECT * FROM whiskysorten where Kriterium = gut && ID=100
      bekomme ich nur einen Datensatz zurück, weil es ID=100 nur einmal gibt. Da ist nichts zu sortieren.

      Habe inzwischen folgendes gefunden:
      $x = 5;
      mysql_query("SELECT * FROM `tabelle` WHERE `id`>".$x." ORDER BY `id` ASC LIMIT 1");
      mysql_query("SELECT * FROM `tabelle` WHERE `id`<".$x." ORDER BY `id` DESC LIMIT 1");

      heißt dass, ich kann somit den vorherigen/nächsten Satz selektieren obwohl nur ein Datensatz meinem Kritrium entspricht?

      Kommentar


      • #4
        PS: Habe < und >-Zeichen übersehen. Scheint also zu funktionieren.
        Sind aber 3 Querys. Geht das auch mit nur einem?

        Kommentar


        • #5
          Zitat von hamburger Beitrag anzeigen
          Bei meiner Abfrage:
          $abfrage = "SELECT * FROM whiskysorten where Kriterium = gut && ID=100
          bekomme ich nur einen Datensatz zurück, weil es ID=100 nur einmal gibt. Da ist nichts zu sortieren.
          Bei nur einem Datensatz nicht, nein.

          Du willst aber einen „vorherigen“ und einen „nächsten“ Datensatz ermitteln - und dazu brauchst du eine Sortierung.

          Habe inzwischen folgendes gefunden:
          Prinzipiell korrekt - bis auf die Tatsache, dass eine ID einzig und allein zur Identifizierung eines Datensatzes dienen sollte, nicht zur Herstellung einer Sortierung.

          heißt dass, ich kann somit den vorherigen/nächsten Satz selektieren obwohl nur ein Datensatz meinem Kritrium entspricht?
          Hast du meinen Hinweis verstanden, hast du den gefundenen Beispielcode verstanden? Klingt irgendwie nicht so.

          Wenn du wissen willst, wer vor und wer hinter Person XY in der Schlange steht - natürlich musst du dann zunächst nur Person XY identifizieren können. Vor und Hinter ergeben sich, wie gesagt, aus der Sortierung.
          [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

          Kommentar


          • #6
            Auch wenn vermutlich schon seit Jahren gelöst, ist es die erste Seite welche man bei den Sumas findet, aber trotzdem nicht wirklich die Lösung wenn man dann eine Sortierung verwendet.
            Vorweg, nur mit SQL ist mir keine Lösung eingefallen, aber mit ein bischen Tricksen war eine richtig brauchbare und sogar halbwegs performante Lösung möglich, solange es sich nicht um x-tausende DS handelt:

            Der Weg über eine Temp-Tabelle:

            # Wer sich nicht sicher ist, Temp vorher löschen
            DROP TEMPORARY TABLE IF EXISTS user_sessid;

            # Temp-Tabelle aufbauen nur mit zeile+id damit es auch schnell geht
            CREATE TEMPORARY TABLE user_sessid ( INDEX(id) )
            ENGINE=MyISAM
            AS (
            SELECT @recno:=@recno+1 as recno, id
            FROM (
            select id from table_1
            where <filter> <order>
            ) t1,
            (
            SELECT @recno:=0
            ) t2);

            #nun die DatensatzNr. meiner ID auslesen / rückgabe ist nLimit=DatensatzNr
            $nLimit = select recno from user_sessid where id= <aktuelle_id> - 2 # Datensatz für Limit um 2 verringern für Limit + Vorheriger DS


            #mit der DatensatzNr. nun den vorhergehenden + aktuellen + nächsten Datensatz auslesen
            $nCounts=3;

            # wenn $nLimit < 0 dann ist der ausgewählte DS in dieser Sortierung der Erste, daher $nLimit + $nCount anpassen
            if($nLimit<0){
            $nCounts+=$nLimit;
            $nLimit=0;
            }

            # so nun die bis zu 3 Datensätze ermitteln
            select <fields> from table_1 where <filter> <order> limit $nLimit , $nCounts

            # beachten wenn der erste/letzte unser DS ist dann sind es nur 2 Datensätze die gefunden werden.
            # kann man z.b. in einer Schleife abfangen

            n.Olivier
            --
            www.nolivier.com - www.reedb.com wo die probleme her kommen


            Kommentar


            • #7
              Zitat von n.Olivier Beitrag anzeigen
              Vorweg, nur mit SQL ist mir keine Lösung eingefallen, aber mit ein bischen Tricksen war eine richtig brauchbare und sogar halbwegs performante Lösung möglich, solange es sich nicht um x-tausende DS handelt:
              Irgendwas mit temporären Tabellen würde ich nicht als "brauchbar" einstufen - mal abgesehen davon dass sich eine ID auch über 12[sic!] Jahre später immer noch nicht dazu eignet Datensätze zu sortieren und damit Vorgänger/Nachfolger festzulegen. Oder hast du hier nur gepostet um deine Spam-Links loszuwerden?

              Aber so wie ich das sehe werden doch die IDs der Datensätze vor und nach dem aktuellen Datensatz gesucht, oder? Dafür gibt es eine SQL-Lösung: Window-Funktionen (im speziellen LAG() und LEAD()) sind dein Freund. Aber lassen wir den Thread einfach in Frieden ruhen …

              Kommentar


              • #8
                Nein, werden sie nicht. Zusätzlich soll auch das Kriterium "gut" erfüllt werden. Es können also beliebig viele "gehtso" oder "schlecht" whikeys dazwischen liegen.

                Selbstverständlich kann man aber die bereits gefundene Lösung mit drei einzelnen queries auch über eine entsprechende UNION clause zu einem einzigen Ergebis mit drei Einträgen zusammenfügen.

                Kommentar

                Lädt...
                X