2010-11-14 4 views
1

J'ai écrit une instruction MySQL pour sélectionner l'élément suivant en utilisant l'horodatage des éléments créés, mais je rencontre un problème lorsque deux éléments ou plus ont exactement le même horodatage. Pour rendre les choses plus confuses, l'identifiant de l'article et les dates créées ne sont pas toujours en ordre, voir les données fictives ci-dessous.Sélectionnez le suivant/prev mysql

ID | créé
~~~~~~~~~~~~
10 | 1289780100
11 | 1289780100
12 | 1289780100 < - Poste actuel
13 | 1289780100
14 | 1289780050
15 | 1289780150

je besoin d'une instruction SQL qui permet de sélectionner la précédente & élément suivant (deux requêtes sont très bien) par création et ID. J'ai fatigué quelques requêtes différentes, mais soit est coincé dans une boucle ou les deux 'prev' & 'suivant' sont les mêmes.

Merci, Owen

Répondre

2
SELECT * 
FROM items 
WHERE created >= current_item_created AND ID >= current_item_ID 
ORDER BY created ASC, ID ASC LIMIT 1,1 

SELECT * 
FROM items 
WHERE created <= current_item_created AND ID <= current_item_ID 
ORDER BY created DESC, ID DESC LIMIT 1,1 
+0

Merci AndreKR, peut-être que je suis plus compliquer choses, mais dans certains cas, les dates créées peuvent ne pas être en ordre . (c'est parce que les éléments sont ajoutés mais pas finis ou publiés) Par exemple. Si l'élément actuel était # 14 dans le tableau ci-dessus je m'attendrais à ce que le précédent soit rien et que le prochain soit # 10 – Owen

+0

@Owen: puis comparez le champ 'created' avec l'élément actuel créé. – zerkms

+0

Alors c'est en effet un peu plus compliqué, mais je pense que ces requêtes (éditées) devraient le faire. – AndreKR

2

Pour prev_id:

SELECT 
    t1.id, t1.name, t1.prev as prev_id 
FROM 
(SELECT mt.id, mt.name, @prev_id as prev, @prev_id := id 
FROM `main_table` mt, (SELECT @prev_id:=0) ni 
ORDER BY name ASC) as t1; 

Pour obtenir next_id - il suffit de changer la commande

Here is full example

+0

+1 Mieux que la réponse acceptée. – Johan