mam dosc nietypowy problem i nie wiem jak sobie z nim poradzic. Dodam, ze uzycie bazy z zalozenia bedzie duze i boje sie, ze zrobie to nieoptymalnie...
Ale do rzeczy: Mam tabelę z listą obiektów, która wygląda tak:
[ id | name ]
oraz tabelę właściwości, która prezentuje się tak:
[ id | object_id | attribute | value ]
Atrybutów dla jednego object_id jest bardzo dużo, między innymi znajduje się tam latitude i longitude, czyli przykładowe wiersze:
[ 45 | 11 | lat | 55.423423 ]
[ 46 | 11 | lng | 21.102234 ]
Baza w taki sposób była budowana dość długo, a teraz ma dojść, że tak powiem feature lokalizacji obiektów za pomocą funkcji haversina, która wykonuje się mniej więcej tak:
haversine_distance(lat_0, lng_0, lat, lng) < 40
Zwraca ona true lub false w zależności od tego, czy dany punkt lat,lng znajduje się w promienu 40 kilometrów od lat_0,lng_0
Zdaję sobie sprawę, że jest to nieoptymalne i najłatwiejszą rzeczą byłoby posiadanie tabeli obiektów w postaci [ id | name | lat | lng ] ( co w ostateczności uczynię )
ale jest jak jest, do tego są już wszystkie mechanizmy i bardziej mi się na chwilę obecną czasowo opłaca zrobić nieludzkie zapytanie niż zmieniać konstrukcję aplikacji.
Tylko... Nie wiem jak owe zapytanie zbudować :/
Do tej pory zapytania wyglądały mniej więcej jakoś tak:
SELECT id FROM objects INNER JOIN objects_attr m1 ON ( objects.id = m1.object_id ) WHERE objects.id > 2233 AND ( m1.attribute = 'lat' AND m1.value < 60 ) AND ( m1.attribute = 'lon' AND m1.value < 30 )
Czy jest jakaś możliwość połączenia tego zapytania z funkcją haversina która de facto musi sprawdzić obie wartości value występujące powyżej?
Jeżeli się nie jasno wyraziłem, to mówić- doprecyzuję, sam nie jestem w stanie sprawdzić, bo już mnie głowa boli od myślenia :s
Dzięki za pomoc.