Door
Furio Scripting
op 30-08-2015 14:17
gewijzigd op 30-08-2015 15:52
2.878 views
Beste forumleden,
Voor een offerte systeem wil ik de 3 dichts bijzijnde bedrijven ophalen die voldoen aan de aanvragers eisen en wensen. Dit gaat op basis van de postcode.
Hij weergeeft nu de drie dichtsbijzijnde afstanden van alle bedrijven maar ik wil graag de 3 bedrijf ids hebben zodat ik daar verder mee kan werken, hoe krijg ik dus ipv de afstand de klant ids maar wel op basis van de dichtsbijzijnde postcodes.
Dat is knap - hoe weet verkrijgKmAfstandsTussenPostcodes welk bedrijfs-id dit is als je enkel $rows['postcode'] en $rows['plaats'] meegeeft? Weet je zeker dat dat de juiste bedrijfs-ids zijn?
Voer je binnen die functie nog meer queries uit (van informatie die je in feite al hebt)? Lekker efficient dan :/.
Dit moet je eenmalig uitvoeren in je SQL tool.
Wil je dit via PMA doen kan dit (in de nieuwste versie) door de database te selecteren en dan tab routines,
je moet dan wel de eerste 4 regels en de laatste regel weg te halen en ook de $$ achter END.
Het gebruik:
SELECT
b.bedrijf,
b.plaats,
GetDistance(@orglat, @orglng, p.lat, p.lng) afstand
FROM
bedrijven b
JOIN
postcodes p
ON p.postcode = b.postcode
CROSS JOIN
(SELECT lat, lng INTO @orglat, @orglng FROM postcodes WHERE postcode = '1234AB')
ORDER BY afstand LIMIT 3
Definieer eerst een vierkant met lengte 2xstraal en breedte 2xstraal en middelpunt orglat, orglng. Kijk eerst wat binnen dit vierkant valt alvorens bovenstaande (en nogal dure) operatie uit te voeren.
Naarmate je in een grotere set zoekt wordt het enkel gebruik maken van bovenstaande functie nogal duur, het is dan beter om eerst een voorselectie te maken met een berekening die een stuk simpeler (en goedkoper) is.
WHERE <makkelijke berekening>
AND <moeilijke berekening>
Door "lazy evaluation" bekijk je dan een (veel) relevant(er)e subset doordat je het domein waarbinnen je zoekt veel strakker afbakent = minder calls naar GetDistance = snellere query.