Comment trouver le prochain enregistrement après un spécifiés dans SQL?
Je voudrais utiliser une seule requête SQL (MySQL) pour trouver le dossier qui vient après celui que j'ai préciser.
I. e., si la table a:
id, fruit
-- -----
1 apples
2 pears
3 oranges
J'aimerais être capable de faire une requête du genre:
SELECT * FROM table where previous_record has id=1 order by id;
(clairement ce n'est pas vrai syntaxe SQL, je suis juste à l'aide de pseudo-SQL pour illustrer ce que je suis en train de réaliser)
qui permettrait le retour:
2, pears
Ma solution actuelle est juste pour récupérer tous les enregistrements, et de regarder à travers eux en PHP, mais c'est plus lent que je le voudrais. Est-il un moyen plus rapide pour le faire?
Je serais heureux avec quelque chose qui est rentré deux lignes -- c'est à dire celui avec la valeur spécifiée et la ligne suivante.
EDIT: Désolé, ma question était mal formulée. Malheureusement, ma définition de "prochain" n'est pas basée sur l'ID, mais sur l'ordre alphabétique du nom des fruits. Donc, mon exemple ci-dessus est fausse, et il faut la retourner oranges, comme il s'agit par ordre alphabétique suivant après les pommes. Est-il un moyen de faire la comparaison sur les cordes au lieu de l'id?
Vous devez vous connecter pour publier un commentaire.
Après la question de l'édition et de la simplification ci-dessous, nous pouvons la changer pour
Encore plus simple
Mise à JOUR:
Si simple, et pas de gymnastique nécessaire
ou, en se fondant sur la chaîne @fruitName = 'pommes', ou 'oranges', etc...
À moins de spécifier un ordre de tri, je ne crois pas que les concepts de "précédent" ou "suivant" sont disponibles dans SQL. Vous n'êtes pas la garantie d'un ordre particulier par le SGBD par défaut. Si vous pouvez trier par colonne dans l'ordre croissant ou décroissant c'est une autre affaire.
Je ne suis pas familier avec la syntaxe de MySQL, mais avec SQL Server, vous pouvez faire quelque chose avec les "top", par exemple:
Cela suppose que le champ id est unique. Si elle n'est pas unique (par exemple, une clé étrangère), vous pouvez faire quelque chose de similaire, puis rejoignez le dos contre la même table.
Depuis je n'utilise pas MySQL, je ne suis pas sûr de la syntaxe, mais imagine être similaire.
Cela devrait fonctionner. La chaîne "pommes" devra être un paramètre.
Combler ce paramètre avec une chaîne, et cette requête renvoie le dossier au complet pour la première fruit après ce point, dans l'ordre alphabétique.
Contrairement à la LIMITE de 1 approche, cela devrait être indépendant de la plateforme.
L'équivalent de la LIMITE de 1 approche dans Oracle (seulement pour la référence) serait celui-ci:
Je ne sais pas MySQL SQL mais j'ai toujours essayer
edit:
éditer deux:
Jason Lepack a dit que ça ne marche pas quand il y a des lacunes et qu'il est vrai et je dois lire la question mieux.
J'aurais dû utiliser google analytics pour trier les résultats sur fruitname
Si vous utilisez
MS SQL Server 2008
(je ne sais pas s'il est disponible pour les versions précédentes)...Dans le cas où vous êtes en essayant de trouver la prochaine et que vous ne disposez pas d'un ID unique pour référence d'une manière, essayez d'utiliser
ROW_NUMBER().
Voir ce lienEn fonction de la façon dont savvy votre
T-SQL
compétence, vous pouvez créer des numéros de ligne en fonction de votre ordre de tri. Ensuite, vous pouvez trouver plus que la précédente et de l'enregistrement suivant. L'utiliser dans des vues ou des sous-requêtes pour trouver un autre dossier relatif à l'enregistrement en cours du numéro de ligne.Si vous souhaitez que l'élément précédent et suivant de l'élément de cette requête vous permet de le faire.
Cela Vous permet également d'avoir des lacunes dans les données!
Comment à ce sujet: