2009-03-12 10 views
0

Je souhaite effectuer une requête pour récupérer l'enregistrement immédiatement après un enregistrement pour un enregistrement donné, dans un jeu de résultats trié par liste. Je ne comprends pas comment utiliser le mot-clé limit dans la syntaxe SQL pour ce faire.Sélection arbitraire des enregistrements suivants avec limite

Je peux utiliser WHERE primarykey = nombre, mais comment limiter le résultat aide quand je n'aurai qu'un seul résultat?

Comment obtenir l'enregistrement suivant avec un numéro de clé primaire arbitraire?

J'ai une clé primaire arbitraire, et je veux sélectionner le suivant trié par date.

+0

Comment est votre clé primaire arbitraire spécifiée? Est-ce dans une procédure stockée ou quelque chose? –

+0

C'est une clé primaire arbitraire seulement parce que chaque clé est unique, mais il n'y a pas d'ordre à eux. –

Répondre

0

pourrait être aussi simple que:

select * 
from mytable 
where datecolumn > (select datecolumn from mytable where id = @id) 
order by datecolumn 
limit 1 

(Edité après commentaires)

+0

Il n'y a pas de TOP 1 en MySQL – Quassnoi

+0

J'ai une clé primaire arbitraire, et je veux sélectionner la suivante en ordre de date, donc je ne pense pas que ça marchera. –

+0

Qu'arrive-t-il s'il y a des doublons de datecolumn? – Quassnoi

2

Cela émule la fonction analytique LEAD() (c.-à sélectionner la valeur suivante pour chaque ligne de la table)

SELECT mo.id, mo.date, 
     mi.id AS next_id, mi.date AS next_date 
FROM (
     SELECT mn.id, mn.date, 
       (
       SELECT id 
       FROM mytable mp 
       WHERE (mp.date, mp.id) > (mn.date, mn.id) 
       ORDER BY 
         mp.date, mp.id 
       LIMIT 1 
       ) AS nid 
     FROM mytable mn 
     ORDER BY 
       date 
     ) mo, 
     mytable mi 
WHERE mi.id = mo.nid 

Si vous voulez juste pour sélectionner la ligne suivante pour un ID donné, vous pouvez utiliser:

SELECT * 
FROM mytable 
WHERE (date, id) > 
     (
     SELECT date, id 
     FROM mytable 
     WHERE id = @myid 
     ) 
ORDER BY 
     date, id 
LIMIT 1 

cela fonctionnera plus efficacement si vous avez un index sur (date, id)

+0

Cela semble fou .. est-il vraiment nécessaire d'avoir 3 requêtes imbriquées? –

+0

Si vous n'avez besoin que du prochain NID, vous pouvez vous débarrasser de la requête la plus externe, sélectionnez simplement NID. Cette requête est rapide, et l'espace disque est très bon marché, donc "requêtes longues" ne signifie pas "requêtes coûteuses" :) – Quassnoi

+0

La deuxième requête ressemble à peu près à ce que vous voulez (mais je ne vois pas pourquoi vous dérangez récupérer 'id' dans la sous-requête sauf pour casser les doublons). – kquinn

1

que diriez-vous quelque chose comme ça, si vous êtes à la recherche de l'un à l'arrière er 34

SELECT * FROM mytable WHERE primaryKey > 34 ORDER BY primaryKey LIMIT 1 
+0

J'ai une clé primaire arbitraire, et je veux sélectionner le prochain ordre par date, donc je ne pense pas que cela fonctionnera. –

Questions connexes