155 votes

Comment obtenir suivant/précédent record dans MySQL?

Dire que j'ai des dossiers avec des Id 3,4,7,9 et je veux être en mesure de passer de l'un à l'autre par navitagion via précédent/suivant des liens. Le problème, c'est que je ne sais pas comment chercher de l'enregistrement avec le plus proche ID supérieure.

Alors, quand j'ai enregistrer avec l'ID 4, j'ai besoin d'être en mesure de fetch next enregistrement existant, qui serait de 7. La requête serait probablement ressembler à quelque chose comme

SELECT * FROM foo WHERE id = 4 OFFSET 1

Comment puis-je récupérer suivant/précédent record sans chercher de résultats ensemble et la main de l'itération?

Je suis de l'utilisation de MySQL 5.

306voto

longneck Points 5884

prochaine:

select * from foo where id = (select min(id) from foo where id > 4)

précédent:

select * from foo where id = (select max(id) from foo where id < 4)

157voto

Decent Dabbler Points 10829

En plus de cemkalyoncu de la solution:

l'enregistrement suivant:

SELECT * FROM foo WHERE id > 4 ORDER BY id LIMIT 1;

ancien record:

SELECT * FROM foo WHERE id < 4 ORDER BY id DESC LIMIT 1;

edit: Depuis cette réponse a été de faire un peu d'upvotes dernièrement, j'ai vraiment envie de souligner le commentaire que j'ai mis plus haut à propos de la compréhension qu'une clé primaire colum est pas conçu comme une colonne pour trier par, parce que MySQL ne garantit pas que plus haut, auto incrémenté, les valeurs sont nécessairement ajouté à une date ultérieure.

Si vous ne vous inquiétez pas à ce sujet, et tout simplement besoin de l'enregistrement d'un supérieur (ou inférieur) id alors cela ne sera pas suffisant. Il suffit de ne pas utiliser cela comme un moyen pour déterminer si un enregistrement est ajouté plus tard (ou plus tôt). À la place, pensez à utiliser une colonne datetime à trier par, par exemple.

66voto

sudip Points 711

Toutes les solutions ci-dessus ont besoin de deux appels de base de données. Ci-dessous le code sql de combiner deux instructions sql dans un.

select * from foo 
where ( 
        id = IFNULL((select min(id) from foo where id > 4),0) 
        or  id = IFNULL((select max(id) from foo where id < 4),0)
      )    

22voto

Cem Kalyoncu Points 4740
SELECT * FROM foo WHERE id>4 ORDER BY id LIMIT 1

14voto

Dan Points 442

J'ai été de tenter de faire quelque chose de semblable à cela, mais j'avais besoin de résultats classés par date, puisque je ne peux pas compter sur le champ ID comme une colonne triable. Voici la solution que j'ai trouvé.

Nous trouvons d'abord l'index de l'enregistrement souhaité dans la table, quand il est trié comme nous voulons:

SELECT row
FROM 
(SELECT @rownum:=@rownum+1 row, a.* 
FROM articles a, (SELECT @rownum:=0) r
ORDER BY date, id) as article_with_rows
WHERE id = 50;

Puis décrémente le résultat par 2 le mettre dans la limite de déclaration. Pour l'exemple ci-dessus revient 21 pour moi, donc je lance:

SELECT * 
FROM articles
ORDER BY date, id
LIMIT 19, 3

Vous donne votre premier enregistrement ainsi que la suivante et précédente donnée dossiers de votre commande.

J'ai essayé de le faire que d'une seule base de données, mais n'a pas pu obtenir la LIMITE de déclaration de prendre une variable comme l'un de ses paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X