Nepoužívám mysql, protože má dost omezené možnosti (mysql nazývám parodií na SQL databáze).
Ale obecně to samozřejmě lze v SQL řešit a je správně to řešit.
Řešení existuje víc, neumím pochopit z popisu, jestli je to vždy:
START
STOP
START
STOP
START
STOP
nebo jestli může nastat situace:
START
STOP
STOP
STOP
START
STOP
STOP
START
STOP
Podle toho se pak v SQL (a taky podle schopností databáze) liší řešení.
Jedním z možných řešení je využít subselecty:
SELECT
[sloupce],
(SELECT ...nejbližší_stop... FROM [tabulka_stopů] WHERE [vodné podmínky])
FROM
[tabulka_startů]
V PostgreSQL by se to řešilo pomocí JOIN LATERAL
, protože subselecty jsou nevýkonné.
Lze to pravděpodobně řešit i JOINEM, jak jste psal. Tam pak záleží na tom, jak jsou data uspořádaná. Pomocí WHERE a DISTINCT ON zle vyfiltrovat a setřídit data tak, aby se ke každému startu našel nejbližší stop, nebo všechny související stopy.
Osobně si myslím, ale opravdu nejsem znalý, že je to přes schopnosti MySQL.
Určitě je správné to řešit na úrovni SQL, řešit to v PHP je prasárna. Do PHP byste si musel natáhnout spoustu dat a v jeho pomalém kódu řešit filtrování. Když to ponecháte na SQL, má databáze možnost dotaz optimalizovat (značná úspora času) a navrátit Vám jen data, která žádáte.
Za dotaz, jestli můžu, tak chválím. Většinou to prasátka napíší v PHP a ani je nenapadne, že by přesně tyto operace mělo řešit SQL, že od toho je.