2009-06-30 2 views
0

J'ai regardé autour et les seules questions/réponses que je peux trouver sur le site sont liées au tri par l'ID dans MySQL. Des questions telles que: stackoverflow.com/questions/645102 et stackoverflow.com/questions/169233Quel est le moyen le plus rapide de trouver l'enregistrement précédent et suivant dans un résultat non trié par ID dans MySQL?

Je cherche plutôt à trouver les lignes précédentes et suivantes lors du tri par une autre colonne autre que ID. Par exemple:

J'ai d'abord exécuter cette requête pour obtenir une liste des utilisateurs:

SELECT id, first_name, last_name 
FROM user 
WHERE last_name LIKE 'm%' 
    AND active_flag = 1 
ORDER BY last_name, first_name 

Maintenant, un utilisateur clique sur l'un des résultats et ils sont envoyés à une page de détails pour cet utilisateur. Sur cette page, je veux afficher les liens précédents et suivants. Une idée que j'ai eu était de faire la même requête, mais de la limiter pour 3 lignes, 1 avant, la suivante et une après, mais j'ai réalisé que je ne sais pas où dans la liste des résultats l'utilisateur actuel est.

Avez-vous d'autres idées que de sélectionner l'ensemble des résultats, d'obtenir la clé du tableau, puis de trouver les précédents et les suivants? J'utilise MySQL et PHP.

Répondre

1

Les opérateurs "inférieur à" et "supérieur à" fonctionnent également sur les champs de type chaîne. Récupère l'enregistrement en cours. Ensuite, faites:

SELECT id, first_name, last_name 
FROM user 
WHERE last_name >= $current_lastname 
    AND first_name > $current_firstname 
    AND active_flag = 1 
ORDER BY last_name, first_name 

Cette requête devrait être rapide si vous avez un index ordonné en clusters sur (last_name, first_name). Bien sûr, il n'y a aucune garantie lors de l'utilisation de MySQL, donc vous devrez exécuter EXPLAIN sur la requête pour être sûr.

Questions connexes