Linuchs: mySQL: Jede n-te Position bereitstellen

Moin,

wenn ich von 200 Positionen die ersten 10 mit Datum lese, dann gibt es 9 Folgeseiten, die ich z.Z. verlinke als Aufzählung 2 3 4 5 6 7 8 9 10

Wenn man ein bestimmtes Datum sucht, "stochert" man also blind in diesem Heuhaufen.

Das erste Datum auf den Folgeseiten zeigen sieht nicht so pralle aus: 20.3. 2.4. 25.4.

Aber ich möchte gerne wissen, ob mySQL jeden 10. Satz ausgeben kann.

Die Alternative wäre, alle Sätze mit PHP durchzuhecheln und 90% der Treffer zu ignorieren. Nicht im Sinne von guter Perfomance.

Linuchs

  1. Tach!

    Aber ich möchte gerne wissen, ob mySQL jeden 10. Satz ausgeben kann.

    Jeden x-ten Datensatz kann man erst nach einer Sortierung bestimmen, weil sonst keine definierte Reihenfolge vorhanden ist. Nach einer Sortierung hat man aber kaum noch Einflussmöglichkeiten auf die Ergebnismenge. Du brauchst also eine sortierte Menge und die aber als Ausgangsmaterial. Das lässt sich als Subquery hinbekommen. Da gibt es aber ein Problem in MariaDB. ORDER BY in Subquerys wird nur ausgeführt, wenn da ein LIMIT angegeben ist. Also musst du da auch noch diese Klausel angeben, und ich würde das mit einem Wert gleich MaxInt machen.

    Diese Query kommt nun als Subquery in die FROM-Klausel der Haupt-Query. Dann braucht es auch noch eine nutzerdefinierte Variable, die du in der SELECT-Klausel um eins hochzählst und das Ergebnis einer Spalte zuweist. Die anderen Spalten musst du mit den gewünschten Werten aus der Subquery belegen. In HAVING kannst du nun mittels Modulo-Operation den gewünschten x-ten Datensatz ermitteln. Eher als HAVING (sprich: in WHERE) geht nicht, weil WHERE ausgewertet wird, bevor SELECT und damit die nutzerdefinierte Variable berechnet wird.

    dedlfix.

  2. Hello Linuchs,

    wenn ich von 200 Positionen die ersten 10 mit Datum lese, dann gibt es 9 Folgeseiten, die ich z.Z. verlinke als Aufzählung 2 3 4 5 6 7 8 9 10

    Ich rechne da, dass es 19 Folgeseiten geben müsste ;-P

    Ich kann Dir nur sagen, wie ich das seit jeher mache:

    • Ich habe einen Index auf "Datum", "ID". Dieser Kombinationsschlüssel ist dafür gut, dass ich mit Duplicates arbeiten kann. Es könnten ja an einem Datum mehrere Eintragungen vorliegen.

    • Dann hole ich kackfrech die Spalten Datum und ID der (bei Dir) 200 nächsten Datensätze in mein PHP-Array

    • Daraus kann ich dann die Aufsetzpunkte in SQL wieder leicht bestimmen "where datum >= '$datum' and ID > $id"

    • Die Anzeige einer Unterliste von dort aus geht es dann mit Limit, wenn sie erforderlich ist.

    Das setzt voraus, dass ID autoincrement ist und auch brav automatisch hochgezählt wird. Ich kenne die Diskussion dazu, habe aber in der Praxis noch nie Probleme damit gehabt.

    In dynamischen Datenbeständen ist aber zu beachten, dass inzwischen Datensätze aus den Bereichen gelöscht worden, oder welche eingefügt worden sein können (blöder Satz, wie gehts besser?)

    Mit Subqueries und/oder Benutzervaroablen habe ich es am Anfang auch versucht. Das ist erfahrungsgemäß sehr viel energiefressender (dauert länger).

    Liebe Grüße
    Tom S.

    --
    Die Krawatte ist das Kopftuch des Westens )