Frage

Ich brauche die Indexposition eines Datensatzes in einer großen Datenbank-Tabelle, um finden einen Pager auf dieses Element Seite voreinzustellen. Ich brauche eine effiziente SQL-Abfrage, die mir diese Nummer geben kann. Leider SQL bietet nicht so etwas wie:

SELECT INDEX(*) FROM users WHERE userid='123'

Jede helle Ideen?

EDIT: Nehmen wir an, es eine ORDER BY-Klausel diese angehängt wird. der Punkt ist, ich alle Datensätze nicht haben wollen, laden Sie die Position eines bestimmten, einen zu suchen. Ich versuche, einen Pager auf die Seite zu öffnen, ein vorhandenes Element halten, die zuvor ausgewählt hatte -., Weil ich in einem Kontextinformationen über die der bereits gewählte Element zur Verfügung stellen möchten, die einem Benutzer erlaubt, eine andere zu wählen

War es hilfreich?

Lösung

Sie könnte so etwas wie (Pseudo-Code) verwenden:

  • Zählen Abfrage: $ n = select count (uid) von {users} wo ... (Auslagerungs Zustand einschließlich Benutzer-ID 123 als Grenze)
  • $ page = floor ($ n / $ pager_size);
  • Anzeige Abfrage: Wählen Sie, was Sie wollen von {users} wobei (Auslagerungs Zustand ohne Limit), übergeben db_query_range (thequery, $ page, $ pager_size)

Sie sollten sich wirklich sehen pager_query , obwohl, weil das ist, was es ist alles über, und es funktioniert im Grunde wie folgt: a. dem Zählen Abfrage und eine Anzeige Abfrage, außer es das Zählen Abfrage automatisch zu bauen versucht,

Andere Tipps

Angenommen, Sie wirklich fragen, wie auf Seite Datensätze in SQL Server 2005 an, einen Blick auf diesen Code von David Hayden :

(Sie müssen das Datum ändern, Beschreibung Ihre Spalten sein)

CREATE PROCEDURE dbo.ShowUsers
    @PageIndex INT, 
    @PageSize INT 
AS

BEGIN 

  WITH UserEntries AS ( 
  SELECT ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row, Date, Description 
  FROM users)

  SELECT Date, Description
  FROM UserEntries 
  WHERE Row BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize

END 

SQL bietet keine Garantie für die Reihenfolge der Objekte in der Tabelle, wenn Sie die OrderBy-Klausel verwenden. Mit anderen Worten, der Index einer bestimmten Zeile kann in nachfolgenden Abfragen ändern. Können Sie beschreiben, was Sie mit dem Pager versuchen zu erreichen?

Sie können in etwas interessiert sein, das die simuliert rownum() von Oracle in MySQL ... wenn Sie MySQL natürlich verwenden, wie es in der Frage nicht angegeben wird.


Notizen :

Sie werden durch alle Aufzeichnungen Ihrer Seiten für das aussehen müssen natürlich arbeiten. Sie brauchen sie nicht vom Datenbankserver mit der PHP-Seite zu holen zurück, aber Sie werden sie in der Abfrage enthalten müssen. Es gibt keinen magischen Trick, um die Position der Zeile in einer Ergebnismenge andere zu bestimmen, als das Ergebnisses der Abfrage festgelegt, da es aufgrund der, wo die Bedingungen ändern könnte, die Aufträge und die Gruppen. Es muss im Kontext sein.

Natürlich, wenn alle Zeilen sequentiell sind, mit Inkremental-ids, keine gelöscht, und Sie wissen, die erste und letzte ids; dann könnte man eine Zählung und mit einfacher Mathematik die Position alles bekommen verwenden, ohne die Abfrage .... aber ich bezweifle, dass Ihr Fall ist, ist es nie ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top