Question

Je dois localiser la position d'index d'un enregistrement dans une grande table de base de données afin de prérégler un pager sur la page de cet élément. J'ai besoin d'une requête SQL efficace qui puisse me donner ce nombre. Malheureusement, SQL n'offre pas quelque chose comme:

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

Des idées brillantes?

EDIT: Supposons qu’une clause ORDER BY soit ajoutée à cela. le fait est que je ne veux pas avoir à charger tous les enregistrements pour localiser la position d'un. J'essaie d'ouvrir un téléavertisseur sur la page contenant un élément existant qui avait déjà été choisi, car je souhaite fournir des informations sur cet élément déjà choisi dans un contexte permettant à l'utilisateur de choisir un autre.

Était-ce utile?

La solution

Vous pouvez utiliser quelque chose comme (pseudo-code):

  • requête de comptage: $ n = sélection du nombre (uid) de {utilisateurs} où ... (votre condition de pagination incluant l'ID utilisateur 123 comme limite)
  • $ page = floor ($ n / $ pager_size);
  • requête d'affichage: sélectionnez ce que vous voulez {utilisateurs} où (votre condition de pagination sans limite), transmis à db_query_range (thequery, $ page, $ pager_size)

Vous devriez vraiment regarder pager_query , cependant, car c’est ce qui est tout à propos de, et cela fonctionne essentiellement comme ceci: une requête de comptage et une requête d'affichage, sauf qu'il essaie de construire la requête de comptage automatiquement.

Autres conseils

En supposant que vous demandiez vraiment comment paginer des enregistrements dans SQL Server 2005, consultez ce code dans David Hayden :

(vous devrez changer la date et la description pour qu'elles soient vos colonnes)

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 ne garantit pas l'ordre des objets dans la table sauf si vous utilisez la clause OrderBy. En d'autres termes, l'index d'une ligne particulière peut changer dans les requêtes suivantes. Pouvez-vous décrire ce que vous essayez d'accomplir avec le pageur?

Vous pourriez être intéressé par quelque chose qui simule la rownum () d'Oracle dans MySQL ... si vous utilisez MySQL bien sûr, car ce n'est pas spécifié dans la question.

Remarques :

Vous devrez bien sûr parcourir tous les enregistrements de vos pages. Vous n'avez pas besoin de les récupérer sur la page PHP à partir du serveur de base de données, mais vous devrez les inclure dans la requête. Il n'y a pas de solution magique pour déterminer la position de votre ligne dans un jeu de résultats autre que l'interrogation du jeu de résultats, car elle pourrait changer en raison des conditions where, des ordres et des groupes. Il faut que ce soit dans le contexte.

Bien sûr, si toutes vos lignes sont séquentielles, avec des identifiants incrémentiels, aucune n’est supprimée et vous connaissez les premier et dernier identifiants; vous pouvez alors utiliser un compte et, avec de simples calculs, obtenir le poste sans tout interroger, mais je doute que ce soit votre cas, ce n'est jamais le cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top