Une solution alternative qui nécessite une requête + un peu de code en faisant un traitement serait:
select l.id lValue, c.id cValue, r.id rValue
from
arrc_vouchers l
right join arrc_vouchers c on l.id=IF(c.id > 0, c.id-1, null)
left join arrc_vouchers r on r.id=c.id+1
where 1=1
and c.id > 0
and (l.id is null or r.id is null)
order by c.id asc;
Notez que la requête ne contient aucun sous-sélection que nous savons qu'il n'est pas manipulé performantly par MySQL planner.
Qui sera de retour une entrée par centralValue (cValue) qui n'ont pas une valeur plus petite (lValue) ou une plus grande valeur (valeur r), c'est à dire:
lValue |cValue|rValue
-------+------+-------
{null} | 2 | 3
8 | 9 | {null}
{null} | 22 | 23
23 | 24 | {null}
{null} | 29 | {null}
{null} | 33 | {null}
Sans entrer dans les détails (nous le verrons dans les paragraphes suivants) cette sortie signifie que:
- Aucune des valeurs entre 0 et 2
- Pas de valeurs entre le 9 et le 22
- Pas de valeurs entre le 24 et le 29
- Aucune des valeurs comprises entre 29 et 33
- Pas de valeurs entre 33 et VALEUR MAX
Donc l'idée de base est de faire du DROIT et GAUCHE rejoint à la même table pour voir si nous avons adjacents valeurs par la valeur (c'est à dire: si la valeur centrale est '3', puis nous vérifier 3-1=2, à gauche et 3+1 à droite), et lorsqu'une LIGNE a une valeur NULL à DROITE ou à GAUCHE alors nous savons qu'il n'est pas une valeur voisine.
Le raw complet sortie de ma table est la suivante:
select * from arrc_vouchers order by id asc;
0
2
3
4
5
6
7
8
9
22
23
24
29
33
Quelques remarques:
- Le SQL SI l'instruction dans la condition de jointure est nécessaire si vous définissez le champ 'id' non signés, par conséquent, il ne vous permettra pas de le diminuer en-dessous de zéro. Ce n'est pas strictement nécessaire si vous gardez le c.valeur > 0 comme il est indiqué dans la note suivante, mais je suis, y compris comme doc.
- Je suis un filtrage du zéro valeur centrale que nous ne sommes pas intéressés par toute valeur précédente et on peut en déduire la valeur post à partir de la ligne suivante.