2009-11-27 7 views
0

J'ai besoin d'une requête qui va chercher un seul élément avant un certain ID et un élément après ce même ID.Requête MySQL récupérer des frères et soeurs

Par exemple, j'ai cinq lignes, id 1 à 5 et j'ai besoin de sélectionner id avant et après id 3, de sorte que j'obtiens 2 et 4 comme résultats.

Existe-t-il un moyen de le faire avec une seule requête?

Edit:

J'ai oublié de dire que peut-être les résultats ne seraient pas frères et sœurs, mais à côté frères et soeurs qui correspond critères:

SELECT routeId FROM routes WHERE routeId>::p0:: AND assetKmId<>'0' 

donc suivant ou précédent frères et soeurs doivent correspondre assetKmId <> « 0 » (ce routeId> :: p0 :: n'est bien sûr pas valide dans ce scénario)

Répondre

1

Pourquoi ne pas utiliser max, min et les résultats syndicaux

SELECT min(routeId) FROM routes WHERE routeId>::p0:: AND assetKmId<>'0' 
UNION 
SELECT max(routeId) FROM routes WHERE routeId<::p0:: AND assetKmId<>'0' 
0

Cela ne fonctionnerait-il pas?

SELECT * FROM :tablename 
WHERE id = :yourid - 1 OR id = :yourid + 1 

Bien sûr, vous devez définir le nom de la table et les paramètres id dans votre requête.

+0

voir modifier, désolé je ne l'ai pas expliqué plus loin – dfilkovi

+0

ah, donc vous voulez le plus proche avant et après qui correspond aux autres critères –

+0

oui, c'est vrai – dfilkovi

0

raffinage solution de solomongaby pour renvoyer des enregistrements complets au lieu de seulement les ID (juste au cas qui est d'aucune utilité pour vous):

SELECT * 
    FROM routes 
WHERE routeId = (select min(routeId) from routes where routeId >::p0::) 
    AND assetKmId <> '0' 
UNION 
SELECT * 
    FROM routes 
WHERE routeId = (select max(routeId) from routes where routeId<::p0::) 
    AND assetKmId<>'0' 
Questions connexes