Sql Limit (Aktueller Eintrag -3,+3)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Sql Limit (Aktueller Eintrag -3,+3)

    Hallo. Okay ich hatte eben schonal ein Thema wie das eröffnet. Dachte ich hätte es gelöst. Da ich die lösung nicht hätte verallgemeinern können, dachte ich mir lösche ich das lieber.
    Naja ich habs doch nicht so ganz gelöst.

    Also nochmal zum Problem, ich hab gerade iwie eine denkblokade..

    Also ich habe 10 Einträge in meiner Datenbank. Ich lasse mir Eintrag 5 ausgeben. Jetzt möchte ich, dass mir aus der sicht von Eintrag 5 die letzten 3 und die nächsten 3 Einträge angezeigt werden.
    Sprich so: 2,3,4 [5] 6, 7, 8.

    Das ganze soll natürlich dynamisch sein. Also wenn ich Eintrag 10 aufrufe, soll das ganze so aussehen 7, 8, 9 [10] 11, 12, 13


    Hat jemand eine Idee wie man das lösen könnte? Eine Theoretische Hilfestellung würde mir eventuell schon helfen.

    Dankee im Vorraus :)


    PS:
    Das ganze ist zwar eine SQL Abfrage wird aber wohl mit PHP gelöst werden? Wusste jetzt nicht ob es in PHP kommt oder Datenbanken. Wenn es falsch ist bitte einmal das thema verschieben. Danke
  • Hey schonmal danke an euch beide. Das mit dem Subselect könnte ich mal testen. Wer ich gleich auch mal machen.

    Zu der anderen Frage wie ich es den Eintrag raushole. Also ich hab eine Klasse, die mir die die Beiträge auf Seiten aufteilt.

    Dafür habe ich 3 Werte.
    1. Wie viele Einträge pro Seite ich angezeigt bekommen möchte ($limit)
    2. Welche Seite gerade aufgeschlagen ist ($page)
    3. Wie viele Beiträge es insgesamt gibt. ($rows)

    Mit diesen Werten, lasse ich mir dann die Seitenzahlen errechnen. Und in der SQL Abfrage, setzte ich das limit auf LIMIT {$limit['start']}, {$limit['rows']}");


    $limit['rows'] ist in dem Fall immer die zahl von punkt 1.
    $limit['start'] berechne ich so:

    Quellcode

    1. $von = $limit*$page;
    2. if($von >= $rows) $von = $rows-$limit;
    3. if($von < 0) $von = 0;



    Und die Struktur der Datenbank sieht so aus: (Bild im Anhang)

    Naja ich hoffe mal, dass das jetzt nicht all zu Kompliziert war. Danke schonmal im Vorraus
    Bilder
    • datenbank.jpg

      46,73 kB, 535×116, 303 mal angesehen
  • Willst du jetzt das programmieren was man unter dem Stichwort Pagination kennt. Also etwas zum Blättern über LIMIT und OFFSET.
    Oder willst du wirklich im Query die IDs auslesen. Wenn IDs fehlen hättest du also sowas:

    1 2 3 [6] 7 8 9


    Macht natürlich auch Sinn.. zum Beispiel in einer Bildergalerie.

    Der Query würde dann wie folgt aussehen

    Quellcode

    1. SELECT * FROM (
    2. SELECT * FROM tbl WHERE id >= 3 LIMIT 4 #inklusiv
    3. UNION
    4. SELECT * FROM tbl WHERE id < 3 LIMIT 3 #exklusive
    5. ) x ORDER BY id ASC
  • Hey danke d0nut. Das sieht mir doch nach einer Lösung aus, die funktionieren könnte. Genau das ganze soll auch in einer Bildergallery arbeiten nachher.
    Ich werd das ganze morgen mal Testen wenn ich Zeit finde. Hoffentlich.

    Nur wenn ich jetzt nicht mit der Spalte "id" arbeite, sondern mit der Spalte "sortierung" geht die SQL Abfrage doch trotzdem mit ein wenig umstellen oder?
    Als wenn wir z.B. die Einträge in der DB so haben:

    ID|sortierung
    ------------------
    1| 2
    2| 1
    3| 4
    4| 5
    5| 3


    Jetzt hab ich das Bild mit der ID 4 und die Sortierung ist 5.
    Das heißt die drei Bilder die vorher aufgerufen werden sollen lauten

    Quellcode

    1. ID: 1, 5, 3 (4)
    2. Sortierung: 2, 3, 4 (5)



    Jetzt könnte ich doch eigentlich die Sortierungszahl von der ID 4 ermitteln per SQL Abfrage.
    Und den WHERE part für die Abfrage der letzten drei so gestalten:

    Quellcode

    1. // $sort vorher per SQL Abfrage definiert sprich wert ist 5
    2. WHERE sortierung < $sort LIMIT 3




    Oder hab ich da einfach ein grooßen Denkfehler? ^^

    Dankeschön für die Hilfe und für's verschieben Lemmi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Snowflake ()

  • Ich weiß nicht genau wo du das Problem siehst ;)
    Aber mir ist noch was eingefallen. Mit OPTIMIZE TABLE wird die natürlich Reihenfolge optimiert, dadurch ist dein Ergebnis im Zweifelsfall nicht das gewünschte.
    Mach daher noch eine Sortierung in die einzelnen Abfragen rein.

    Quellcode

    1. SELECT * FROM (
    2. SELECT * FROM tbl WHERE sortierung >= 3 ORDER BY sortierung ASC LIMIT 4 #inklusiv
    3. UNION
    4. SELECT * FROM tbl WHERE sortierung < 3 ORDER BY sortierung DESC LIMIT 3 #exklusive
    5. ) x ORDER BY sortierung ASC