2009-03-06 3 views
1

Ich muss die Indexposition eines Datensatzes in einer großen Datenbanktabelle suchen, um einen Pager auf der Seite dieses Elements zu speichern. Ich brauche eine effiziente SQL-Abfrage, die mir diese Nummer geben kann. Leider bietet SQL nicht so etwas wie:Index eines Datensatzes in einer Tabelle

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

Irgendwelche guten Ideen?

EDIT: Nehmen wir an, dass es eine ORDER BY-Klausel angehängt ist. Der Punkt ist, ich möchte nicht alle Datensätze laden müssen, um die Position eines bestimmten zu finden. Ich versuche, einen Pager für die Seite zu öffnen, die ein bereits ausgewähltes Element enthält - weil ich Informationen über das bereits ausgewählte Element in einem Kontext bereitstellen möchte, der es einem Benutzer ermöglicht, ein anderes auszuwählen.

Antwort

3

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 li mit)
  • $ page = floor ($ n/$ pager_size);
  • Anzeige Abfrage: Wählen Sie, was Sie von {users} wollen, wo (Auslagerungs Zustand ohne Limit), übergeben db_query_range (thequery, $ page, $ pager_size)

Sie wirklich pager_query aussehen sollte Allerdings, weil es darum geht, und es funktioniert grundsätzlich so: eine Zählanfrage und eine Display-Abfrage, außer dass es versucht, die Zählanfrage automatisch zu erstellen.

+0

Sie antworten am nächsten zu dem, was ich getan habe. Dies ist in einer Sichtweise etwas komplizierter.Ich hooke _views_pre_query, genannt _views_get_query, dann tun, was pager_query tut, aber mit zusätzlichen Bedingung in Bezug auf die Sortierreihenfolge ("... WHERE ... node.changed> =". $ Node.changed) seit ORDERED BY Aktualisierungszeit .. Vielen Dank! –

0

SQL garantiert nicht die Reihenfolge der Objekte in der Tabelle, es sei denn, Sie verwenden die OrderBy-Klausel. Mit anderen Worten, der Index einer bestimmten Zeile kann sich in nachfolgenden Abfragen ändern. Können Sie beschreiben, was Sie mit dem Pager erreichen wollen?

0

Sie könnten an etwas interessiert sein, das simulates the rownum() von Oracle in MySQL ... wenn Sie MySQL natürlich verwenden, wie es in der Frage nicht angegeben ist.


Hinweise:

Sie werden durch alle Aufzeichnungen Ihrer Seiten sehen müssen, dass für selbstverständlich an die Arbeit. Sie müssen sie nicht vom Datenbankserver auf die PHP-Seite zurückholen, sondern müssen sie in die Abfrage aufnehmen. Es gibt keinen magischen Trick, um die Position Ihrer Zeile in einer Ergebnismenge zu bestimmen, außer dass die Ergebnismenge abgefragt wird, da sie sich aufgrund der Bedingungen, der Reihenfolgen und der Gruppen ändern kann. Es muss im Kontext sein.

Natürlich, wenn alle Zeilen sequenziell sind, mit inkrementellen IDs, werden keine gelöscht, und Sie kennen die ersten und letzten IDs; dann könntest du eine Zählung verwenden und mit einfacher Mathematik die Position bekommen, ohne alles zu hinterfragen .... aber ich bezweifle, dass das dein Fall ist, es ist es nie.

1

Sie fragt, wirklich, wie Sie auf Seite Datensätze in SQL Server 2005 an, hat von David Hayden an diesem Code einen Blick Unter der Annahme:

(Sie werden Datum ändern müssen, 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