Domanda

Devo individuare la posizione dell'indice di un record in una tabella di database di grandi dimensioni per preimpostare un cercapersone sulla pagina di quell'elemento. Ho bisogno di una query SQL efficiente che possa darmi questo numero. Purtroppo SQL non offre qualcosa di simile:

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

Qualche idea brillante?

EDIT: supponiamo che sia aggiunta una clausola ORDER BY. il punto è che non voglio caricare tutti i record per individuare la posizione di uno specifico. Sto cercando di aprire un cercapersone sulla pagina contenente un elemento esistente che era stato precedentemente scelto, perché desidero fornire informazioni su quell'elemento già scelto in un contesto che consenta all'utente di sceglierne uno diverso.

È stato utile?

Soluzione

Potresti usare qualcosa come (pseudo-codice):

  • query di conteggio: $ n = seleziona il conteggio (uid) da {utenti} dove ... (la tua condizione di paging incluso userid 123 come limite)
  • $ page = floor ($ n / $ pager_size);
  • query di visualizzazione: seleziona cosa vuoi da {utenti} dove (la tua condizione di paging senza il limite), passata a db_query_range (thequery, $ page, $ pager_size)

Dovresti davvero guardare pager_query , perché è quello che è e funziona praticamente in questo modo: una query di conteggio e una query di visualizzazione, tranne che prova a creare automaticamente la query di conteggio.

Altri suggerimenti

Supponendo che tu stia davvero chiedendo come pagina i record in SQL Server 2005 in poi, dai un'occhiata a questo codice da David Hayden :

(dovrai cambiare Data, Descrizione come colonne)

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 non garantisce l'ordine degli oggetti nella tabella se non si utilizza la clausola OrderBy. In altre parole, l'indice di una determinata riga può cambiare nelle query successive. Puoi descrivere cosa stai cercando di realizzare con il cercapersone?

Potresti essere interessato a qualcosa che simula il rownum () di Oracle in MySQL ... se stai usando MySQL ovviamente perché non è specificato nella domanda.


Note :

Dovrai cercare tra tutti i registri delle tue pagine affinché funzioni, ovviamente. Non è necessario recuperarli nella pagina PHP dal server di database, ma è necessario includerli nella query. Non esiste un trucco magico per determinare la posizione della riga all'interno di un set di risultati oltre a eseguire una query sul set di risultati in quanto potrebbe cambiare a causa delle condizioni dove, degli ordini e dei gruppi. Deve essere nel contesto.

Naturalmente, se tutte le tue righe sono sequenziali, con ID incrementali, nessuna viene eliminata e conosci il primo e l'ultimo ID; allora potresti usare un conteggio e con la semplice matematica ottenere la posizione senza interrogare tutto .... ma dubito che sia il tuo caso, non lo è mai.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top