Per quanto riguarda le subquery, qualcuno fa qualcosa di questo genere, guardando su internet, ti riporto qualcosa che potrebbe essere di aiuto.
Ho cercato "mysql selecting previous and following row of an element"... magari trovi qualcosa che ti può aiutare.
Codice PHP:
(select min(id) from foo where id > 4) and (select max(id) from foo where id < 4)
SELECT * FROM tabella WHERE ID = (SELECT min(ID) FROM tabella WHERE ID > $id ORDER BY ID LIMIT 1) AND (SELECT max(ID) FROM tabella WHERE ID < $id ORDER BY ID LIMIT 1)
Codice PHP:
select * from tabella
where (
id = IFNULL((select min(id) from tabella where id > 4),0)
or id = IFNULL((select max(id) from tabella where id < 4),0)
)
Non sono un esperto di subqueries quindi non ho verificato la loro funzionalità. a livello teorico mi sembrano sensate comunque.
Un altra idea che ho trovato era di usare un UNION SELECT o qualcosa del genere
Codice PHP:
(SELECT * FROM Tabella WHERE id < 3 ORDER BY id DESC LIMIT 1)
UNION
(SELECT * FROM Tabella WHERE id > 3 ORDER BY id LIMIT 1)
E magari agire su delle unioni di dati e pescare quindi il tutto da qui... Tipo che so
Codice PHP:
(SELECT * FROM Tabella WHERE ID=$id) UNION (SELECT * FROM Tabella WHERE ID<$id ORDER BY ID DESC LIMIT 1) UNION (SELECT * FROM Tabella WHERE ID>$id ORDER BY ID LIMIT 1)
Non ho idea se questa funzioni cioè l'ho pensata alcuni minuti e mi viene da scrivertela così in modo grezzo, l'ho provata un attimo e mi sembra ok, ma dovrai adattarla, prova a vedere se con questo magari ti viene qualche idea, in genere non faccio query complesse quindi probabilmente c'è qualcosa di sbagliato. In pratica cerco di unire le query selezionando di volta in volta dei dati precisi ma non so se sia esattamente questo il modo in cui vuoi farlo. Ad ogni modo credo che anche facendo così non sia molto diverso che da fare 3 query separate, però vedi tu come ti sembra meglio, per il discorso dei milioni di dati al limite potresti usare dei LIMIT per non dover gestire risultati troppo grossi... Dipende quanta roba devi tirare fuori di volta in volta... Se sai che prendi solo poche righe alla volta ti conviene usare un LIMIT a mio avviso.