2009-08-17 6 views
0

J'ai une table dans la base de données qui a des identifiants uniques. J'ai une page où un identifiant particulier est montré et un lien est donné pour les id suivant et précédent. Je dois obtenir les identifiants prev et next par une seule requête mysql. Tout ce que j'ai, c'est l'identifiant sur lequel nous travaillons actuellement. id ne sont pas des numéros consécutifs car parfois certains identifiants sont également supprimés (par exemple, 1,2,3,7,9,10,15 etc)précédent - la prochaine requête dans mysql

Alors, comment puis-je obtenir ces deux ID précédents et suivants en un requête unique ????

Répondre

6
SELECT 
    (SELECT id FROM YourTable WHERE id < YourId ORDER BY id DESC LIMIT 1) AS prev, 
    (SELECT id FROM YourTable WHERE id > YourId ORDER BY id ASC LIMIT 1) AS next 
; 

Remplacez YourId par l'ID réel et remplacez YourTable par un nom de table valide. Si l'une des valeurs est NULL, il n'y a pas d'élément next/prev pour le donné.

+0

son donnant cette erreur # 1241 - L'opérande doit contenir 1 colonne (s) – developer

+0

Assurez-vous d'avoir remplacé tous les fichiers YourTable et YourId dans la requête. Cela fonctionne vraiment, je l'ai vérifié avant de poster. – RaYell

0

Peut être que vous essayez quelque chose comme -

id SÉLECTIONNEZ yourtable où id> 'current_page_id $' LIMIT 1 pour la prochaine

id SÉLECTIONNEZ yourtable où id < LIMIT $ current_page_id '1 pour précédent

vous pouvez le faire une requête selon la réponse @RaYell.

-1
SELECT MAX(id) FROM mytable WHERE id < 11 
  • Pour obtenir l'ID AVANT 11

    SELECT MIN (id) FROM mytable WHERE id> 11

  • Pour obtenir l'ID APRÈS 11

+0

Ce n'est pas une requête, n'est-ce pas? – RaYell

+0

vous pouvez les coller ensemble en une seule requête, pas un problème. les gens ont aussi fait pendant que je posterais :) –

1
SELECT * 
FROM (
     SELECT * 
     FROM mytable 
     WHERE id >= @current 
     ORDER BY 
       id 
     LIMIT 2 
     ) q1 
UNION ALL 
SELECT * 
FROM (
     SELECT * 
     FROM mytable 
     WHERE id < @current 
     ORDER BY 
       id DESC 
     LIMIT 1 
     ) q2 
ORDER BY 
     id