Disons que j'ai des enregistrements avec des identifiants 3, 4, 7, 9 et que je veux pouvoir passer de l'un à l'autre en naviguant via les liens suivant / précédent. Le problème est que je ne sais pas comment récupérer l'enregistrement avec l'ID le plus proche.
Ainsi, quand j'ai un enregistrement avec l'ID 4, je dois être en mesure de récupérer le prochain enregistrement existant, qui serait 7. La requête ressemblerait probablement à quelque chose comme
SELECT * FROM foo WHERE id = 4 OFFSET 1
Comment puis-je récupérer l'enregistrement suivant / précédent sans récupérer l'ensemble de résultats et l'itérer manuellement?
J'utilise MySQL 5.
Réponses:
suivant:
précédent:
la source
En plus de la solution de cemkalyoncu :
enregistrement suivant:
enregistrement précédent:
edit: Étant donné que cette réponse a reçu quelques votes positifs ces derniers temps, je tiens vraiment à souligner le commentaire que j'ai fait plus tôt sur la compréhension qu'une colonne de clé primaire n'est pas conçue comme une colonne à trier, car MySQL ne garantit pas que l'incrémentation automatique plus élevée , les valeurs sont nécessairement ajoutées ultérieurement.
Si vous ne vous souciez pas de cela et que vous avez simplement besoin du record avec un plus haut (ou plus bas),
id
cela suffira. N'utilisez pas cela comme un moyen de déterminer si un enregistrement est réellement ajouté plus tard (ou plus tôt). Au lieu de cela, envisagez d'utiliser une colonne datetime pour trier, par exemple.la source
Toutes les solutions ci-dessus nécessitent deux appels à la base de données. Le code sql ci-dessous combine deux instructions SQL en une seule.
la source
DISTINCT
avant*
le rendra encore meilleur, c'est-à-dire, bien sûr, s'ilid
peut avoir une0
valeur.id
plutôt que deux.la source
SELECT * FROM foo WHERE id<4 ORDER BY id DESC LIMIT 1
pour le disque précédentJ'essayais de faire quelque chose de similaire, mais j'avais besoin des résultats classés par date car je ne peux pas me fier au champ ID en tant que colonne triable. Voici la solution que j'ai trouvée.
Tout d'abord, nous trouvons l'index de l'enregistrement souhaité dans la table, quand il est trié comme nous le voulons:
Puis décrémentez le résultat de 2 et placez-le dans l'instruction limit. Par exemple, ce qui précède a renvoyé 21 pour moi, alors je lance:
Vous donne votre enregistrement principal avec ses enregistrements suivants et précédents selon votre ordre indiqué.
J'ai essayé de le faire en un seul appel à la base de données, mais je n'ai pas pu obtenir l'instruction LIMIT pour prendre une variable comme l'un de ses paramètres.
la source
Essayez cet exemple.
Remarque: si la valeur n'est pas trouvée, elle retournera null .
Dans l'exemple ci-dessus, la valeur précédente sera Raja et la valeur suivante sera nulle car il n'y a pas de valeur suivante.
la source
En utilisant l'approche de @Dan, vous pouvez créer des JOIN. Utilisez simplement une variable @ différente pour chaque sous-requête.
la source
current
->current_row
&previous
->previous_row
.Ligne suivante
Ligne précédente
échantillon de la ligne suivante
échantillon de la ligne précédente
la source
J'ai eu le même problème que Dan, alors j'ai utilisé sa réponse et je l'ai améliorée.
Sélectionnez d'abord l'index de ligne, rien de différent ici.
Utilisez maintenant deux requêtes distinctes. Par exemple, si l'index de ligne est 21, la requête pour sélectionner l'enregistrement suivant sera:
Pour sélectionner l'enregistrement précédent, utilisez cette requête:
Gardez à l'esprit que pour la première ligne (l'index de ligne est 1), la limite passera à -1 et vous obtiendrez une erreur MySQL. Vous pouvez utiliser une instruction if pour éviter cela. Ne sélectionnez rien, car il n'y a de toute façon aucun enregistrement précédent. Dans le cas du dernier enregistrement, il y aura la ligne suivante et il n'y aura donc aucun résultat.
Gardez également à l'esprit que si vous utilisez DESC pour le classement, au lieu de ASC, les requêtes pour sélectionner les lignes suivante et précédente sont toujours les mêmes, mais commutées.
la source
C'est une solution universelle pour les conditions avec plus de mêmes résultats.
la source
Ici, nous avons un moyen de récupérer les enregistrements précédents et suivants en utilisant une seule requête MySQL. Où 5 est l'identifiant de l'enregistrement actuel.
la source
Comment obtenir l'enregistrement suivant / précédent dans MySQL et PHP?
Mon exemple est d'obtenir l'identifiant uniquement
la source
Optimiser l'approche @Don pour n'utiliser qu'une seule requête
changer CurrentArticleID avec l'ID d'article actuel comme
la source
Il existe une autre astuce que vous pouvez utiliser pour afficher les colonnes des lignes précédentes, en utilisant l'ordre de votre choix, en utilisant une variable similaire à l'astuce @row:
Apparemment, les colonnes de sélection sont évaluées dans l'ordre, donc cela sélectionnera d'abord les variables enregistrées, puis mettra à jour les variables vers la nouvelle ligne (en les sélectionnant dans le processus).
NB: Je ne suis pas sûr que ce soit un comportement défini, mais je l'ai utilisé et cela fonctionne.
la source
Si vous souhaitez en nourrir plusieurs
id
pour votre requête et obtenirnext_id
pour toutes ...Attribuez-le
cur_id
dans votre champ de sélection, puis transmettez-le à la sous-requête en entrantnext_id
dans le champ de sélection. Et puis sélectionnez justenext_id
.Utilisation de la réponse à long cou pour calculer
next_id
:la source
la source
Si vous avez une colonne d'index, disons id, vous pouvez renvoyer l'identifiant précédent et suivant dans une requête SQL. Remplacez: id par votre valeur
la source
Ma solution pour obtenir le prochain enregistrement et les aperçus également pour revenir au premier enregistrement si je suis par le dernier et vice versa
Je n'utilise pas l'identifiant J'utilise le titre pour de belles URL
J'utilise Codeigniter HMVC
la source
Voici ma réponse. Je prends une idée de ' Decent Dabbler ' et ajoute la partie qui vérifie si l' id est entre min (id) et max (id). Voici la partie pour créer ma table.
);
L'étape suivante consiste à créer une procédure stockée chargée d'obtenir l'ID précédent.
La première méthode est bonne si les index sont triés, mais s'ils ne le sont pas. Par exemple, si vous avez des index: 1, 2, 7 et que vous devez obtenir l'index numéro 2 de cette manière, il est préférable d'utiliser une autre approche.
la source
100% de travail
la source
Je pense que pour avoir la vraie ligne suivante ou précédente dans la table SQL, nous avons besoin de la valeur réelle avec égal, (<ou>) renvoie plus d'un si vous devez changer la position de la ligne dans une table de commande.
nous avons besoin de la valeur
$position
pour rechercher laneighbours
ligne Dans ma table, j'ai créé une colonne 'position'et la requête SQL pour obtenir la ligne nécessaire est:
pour la prochaine:
pour le précédent:
la source
Sélectionnez le top 1 * de foo où id> 4 order by id asc
la source
select * from foo where id>4 order by id asc LIMIT 1