Ermitteln an wievielter Stelle Datensatz ist? (mysql)
Schonzenbrodler
- datenbank
Tach
wenn ich eine Abfrage absteigend nach nummern ordnen lasse, steht ja der datensatz mit der nummer 2743 an einer bestimmten stelle in dieser odnung.
lässt sich herausfinden an welcher? also dass er zum beispiel an 3000. stelle in dieser ordnung steht.
ich danke euch schon vielmals für eure unterstützung, thx
hi,
wenn ich eine Abfrage absteigend nach nummern ordnen lasse, steht ja der datensatz mit der nummer 2743 an einer bestimmten stelle in dieser odnung.
lässt sich herausfinden an welcher? also dass er zum beispiel an 3000. stelle in dieser ordnung steht.
gesetzt den fall, dass es keine lücken in der nummerierung gibt, müsste der erst datensatz dann wohl die nummer -256 oder -257 haben :-)
aber erklär mal bitte, wofür du das brauchst, ich kann's mir gerade nicht vorstellen, wofür man das brauchen könnte ...
gruss,
wahsaga
Also, es gibt jedenfalls keine durchgehende Nummerierung, sonst wäre das ja einfach.
Angenommen ich selektiere 5000 Datensätze, der höchste hat Nummer 7493 und es gibt verschieden große Lücken dazwischen, weil Datensätze rausgelöscht wurden. Ich möchte jetzt die Position von Datensatz 3000 wissen.
Brauchen tueich das für eine Seitenausgabe, mit 50 Nummern pro Seite.
Wenn jetzt direkt eine Nummer angewählt wird, muss ich wissen an welcher Position der gewählte Datensatz ist, damit ich berechnen kann welche Seite ausgewählt wird.
Hi,
entweder gibt es da einen Denkfehler oder ich versteh das nicht. Die Position eines Datensatzes hängt ja immer vom Select-Statement ab, mit dem Du das ganze anforderst.
Damit Du auf den Datensatz mit Feld 2345 klicken kannst, musst Du ihn doch bereits einmal aus der Datenbank ausgelesen haben und dabei erhälst Du doch seine Position - halt die im zurückgegebenen Array.
Damit hast Du doch seine sogenannte Position.
Oder?
Stephan
Also, es gibt jedenfalls keine durchgehende Nummerierung, sonst wäre das ja einfach.
Angenommen ich selektiere 5000 Datensätze, der höchste hat Nummer 7493 und es gibt verschieden große Lücken dazwischen, weil Datensätze rausgelöscht wurden. Ich möchte jetzt die Position von Datensatz 3000 wissen.
Brauchen tueich das für eine Seitenausgabe, mit 50 Nummern pro Seite.
Wenn jetzt direkt eine Nummer angewählt wird, muss ich wissen an welcher Position der gewählte Datensatz ist, damit ich berechnen kann welche Seite ausgewählt wird.
Das hab ich doch alles schon beschrieben.
Ich hab in einer Datenbank 100.000 Datensätze, mit Nummern.
Nach diesen Nummern absteigend sortiert hole ich mir jetzt die ersten 5000 Datensätze. Die sind aber nicht durchgehend nummeriert, da sie auto_increment sind und zwischendurch welche gelöscht wurden.
An welcher Position ist jetzt der Datensatz mit Nummer 2634 ?
An 3000. Stelle? Oder an 2543.? DAS will ich wissen.
Na was heisst denn "hole ich mir die Datensätze ...". Du liest sie doch der Reihe nach aus, dann mach Dir doch Deinen eigenen Index beginnend bei 1 mit jeder ausgelesenen Zeile.
Beispiel in Perl:
my $sql = "select a,b from c";
my $datsql = $dbh->prepare($sql);
my $datsql->execute;
my $dat_array = $datsql->fetchall_arrayref;
my $datsql->finish;
my $mein_zaehler = 0; # DAS IST DER ZAEHLER!!!
foreach my $dat_arr (@$dat_array)
{
$mein_zaehler++;
print $mein_zaehler . "$dat_arr->[0] \n";
}
Damit hast Du doch den Zaehler und kannst ihn natuerlich in HTML (z.B. im QueryString oder einem Hidden-Feld) auch weiterverwenden.
Stephan
Hallo Schonzenbrodler,
Ich hab in einer Datenbank 100.000 Datensätze, mit Nummern.
oje, das werden ja immer mehr :-)
Nach diesen Nummern absteigend sortiert hole ich mir jetzt die ersten 5000 Datensätze. Die sind aber nicht durchgehend nummeriert, da sie auto_increment sind und zwischendurch welche gelöscht wurden.
mir ist nur noch nicht so ganz klar, für was du die brauchst. Du holst die Datensätze doch mit "... LIMIT 3000,50" (3000 != id) aus der DB, oder? Damit weißt du doch, dass der erste Datensatz dieser 50 die Nummer 3000 hat, und die folgenden lassen sich ja leicht durchnummerieren.
An welcher Position ist jetzt der Datensatz mit Nummer 2634 ?
An 3000. Stelle? Oder an 2543.? DAS will ich wissen.
das ginge nur sehr kompliziert, indem du die Datenbank mit "... WHERE id <= 2634" abfragst, und dann zählst wieviele Datensätze du bekommst (das müsste dann die Position des Datensatztes sein, wenn ich mich nicht "verdacht" habe :-)). Allerdings ist das ganze sehr aufwendig und imho nicht nötig.
Grüße aus Nürnberg
Tobias
das ginge nur sehr kompliziert, indem du die Datenbank mit "... WHERE id <= 2634" abfragst, und dann zählst wieviele Datensätze du bekommst (das müsste dann die Position des Datensatztes sein, wenn ich mich nicht "verdacht" habe :-)). Allerdings ist das ganze sehr aufwendig und imho nicht nötig.
Tja, dafür müsste ich aber extra eine Abfrage dafür machen, was ich nicht will, da das nur zusätzlich Zeit und Aufwand für die Datenbank bedeuten würde.
Ich dachte halt, es gibt so einen Befehl oder so.
hi,
Tja, dafür müsste ich aber extra eine Abfrage dafür machen, was ich nicht will, da das nur zusätzlich Zeit und Aufwand für die Datenbank bedeuten würde.
stattdessen willst du 5000 datensätze auf einmal auslesen, um dann nur fünfzig auf einer seite anzeigen zu lassen?
_das_ würde ich als unperformant bezeichnen.
gruss,
wahsaga
Moin!
Ich hab in einer Datenbank 100.000 Datensätze, mit Nummern.
Nach diesen Nummern absteigend sortiert hole ich mir jetzt die ersten 5000 Datensätze. Die sind aber nicht durchgehend nummeriert, da sie auto_increment sind und zwischendurch welche gelöscht wurden.
An welcher Position ist jetzt der Datensatz mit Nummer 2634 ?
Diese Information ist für die Datenbank - und auch für dich - irrelevant.
Du willst Seiten ausgeben, auf denen jeweils eine fortlaufende Teilmenge der Datenbank ausgegeben wird. Also im Prinzip willst du blättern.
Die Anweisung LIMIT liefert dir dazu alles, was du wissen mußt. Damit kannst du exakt den 120.sten Datensatz deiner Sortierung, sowie die nachfolgenden x Datensätze auswählen und ausgeben lassen.
Das Blättern ist lediglich eine Variation dieser Zahlen: Die Zahl der Datensätze pro Seite dürfte konstant sein, und die Startzahl, bei welcher die Datensatzliste beginnt, wird verändert.
Mit anderen Worten: Wenn du 20 Datensätze pro Seite ausgeben willst, und du bei der laufenden Nummer 120 bist, hast du damit genau zwei Informationen:
Die vorhergehende Seite beginnt bei laufender Nummer 100 (120 - 20 = 100), und die nachfolgende Seite beginnt bei laufender Nummer 140 (120 + 20 = 140).
Eine dieser Zahlen gibst du in dein neues LIMIT ein, um die vorhergehende oder nachfolgende Seite aufzurufen. Nirgendwo hingegen erscheint die Datensatz-ID. Sie ist in diesem Zusammenhang irrelevant, weil sie allenfalls ein Sortier-Kriterium ist (das aber auch nur, wenn einem sonst nichts besseres einfällt - üblicherweise wird eher nach Dingen wie Name etc. sortiert), aber kein Listenzugriffskriterium.
Logischerweise mußt du verhindern, dass du außerhalb des Bereichs gültiger LIMITs blätterst. Wenn also die vorhergehende Seite bei einer Datensatznummer kleiner als Null starten soll, solltest du den Wert auf Null (oder war es Eins?) setzen. Und wenn am Ende der Liste weniger als 20 Datensätze ausgegeben werden (mitzählen oder die Datenbank fragen), dann lohnt es kaum, noch einen Link auf die folgende Seite zu setzen, weil die dann mit Sicherheit leer sein wird.
- Sven Rautenberg
Danke, aber so habe ich es bis jetzt ja auch gemacht.
Nun möchte ich aber anhand der ID herausfindn welche Seite aufgerufen werden soll.
Und genau deshalb muss ich wissen an welcher Position im Abfrageergebenis genau diese ID liegt.
Moin!
Danke, aber so habe ich es bis jetzt ja auch gemacht.
Nun möchte ich aber anhand der ID herausfindn welche Seite aufgerufen werden soll.
Ich kann den Sinn der Aktion nicht nachvollziehen. Und die Programmierer der Datenbanksysteme vermutlich auch nicht, sonst hätten sie Möglichkeiten eingebaut, dazu zu realisieren.
Entweder will man üblicherweise eine Liste der Datensätze haben - dann ist die konkrete Datensatz-ID unerheblich, lediglich eine weitere Information, die man ausgeben kann (aber nicht muß), und man kommt mit selbstgezählten laufenden Nummern wunderbar klar.
Oder man will einen konkreten Datensatz komplett anzeigen. Dann nimmt man als Zugriffskriterium logischerweise die Datensatz-ID her - und fertig.
Ich habe außerdem in deiner Problembeschreibung noch nicht verstanden, warum du aus 100.000 Datensätzen eine Menge von 5.000 Datensätzen holst, um dann 50 je Seite auszugeben.
Ich ahne anhand deiner Beschreibung, dass du vielleicht eine Selektions-Übersichtsseite realisieren willst: Ein Verzeichnis aller möglichen anzeigbaren Blätterseiten. Möglicherweise willst du als Handreichung für den Benutzer dann dort angeben, welcher ID-Bereich auf jeder einzelnen Seite enthalten ist.
Diese Information ist aber entweder irrelevant (was hilft es dem Benutzer, wenn er die uninteressanten, weil nur für interne Zwecke zu verwendenden IDs kennt - und was hilft es ihm, wenn er feststellt, dass die IDs lückenhaft vergeben sind), oder du hast noch nicht durchschaut, dass auch solch eine Seite eine Anwendung der Blättern-Funktion ist. Stelle fest, wieviele Datensätze du insgesamt zur Verfügung stellen willst, bzw. wieviele dein Suchkriterium ergeben. SELECT COUNT(*) FROM TABELLE WHERE kriterium. Diese Anzahl ist schnell ermittelt. Dann gibt etwas Programmcode eine Liste von Links aus, die jeweils die Startdaten für jede einzeln anzeigbare Seite enthalten. Du weißt, wieviele Datensätze es gibt, du weißt, wieviele Datensätze pro Seite angezeigt werden, also kannst du für jede Seite das LIMIT bestimmen und in den Link packen.
- Sven Rautenberg
Hi,
Also, es gibt jedenfalls keine durchgehende Nummerierung, sonst wäre das ja einfach.
Angenommen ich selektiere 5000 Datensätze, der höchste hat Nummer 7493 und es gibt verschieden große Lücken dazwischen, weil Datensätze rausgelöscht wurden. Ich möchte jetzt die Position von Datensatz 3000 wissen.
Laß die Datenbank (select) zählen (count), wieviele Datensätze es in der Tabelle (from deinetabelle) gibt, die (where) eine Nummer (Nummer) kleinergleich (<=) der angegebenen Nummer (7493) sind.
cu,
Andreas