Są 4 tabele:
-firmy
-produkty
-produkt_firma
-miasta.
produk_firma to tabela łącząca firmy z produktami




Pisząc po ludzku chodzi o to.
Wyświetl firmy (łącznie z miastami w których one są) które oferują produkt o id_produktu=577 i znajdują się w odległości mniejszej niż 20km od miasta o współrzędnych 21.20563 i 50.56122 i dodatkowo status firmy=1 i jakieś tam sortowanie na koniec.
W kwestii wytłumaczenia.
Mój plan był taki żeby pierwsze obliczyć w php i odciąć wszystkie niepotrzebne miejscowości poza tymi które znajdują się w zakresie poszukiwań (powstaje kwadrat z miastami).
Następnie trzeba "zakreślić w tym kwadracie koło i odciąć niepotrzbne rogi" czyli wzór na koło x^2+y^2<r^2 a w mysql - (sqrt( POW(dlugosc-21.20563,2)+POW(szerokosc-50.56122,2) )<20*0.013994 )
Współczynnik 0.013994 musi być ale to nie ważne teraz. Miast w bazie jest 1000 a docelowo kiedyś 50000 więc nie chce mysleć co się wtedy będzie działo

Ostatecznie wszystko działa ale cholernie woooolno bo takie zapytanie wykonuje się około 0.5s a każda część z osobna, nawet
ta obliczająca pierwisatki - 0.001s, różnica kolosalna. Dopiero zaczynam zabawe w sql i nie bardzo kumam jak to zoptymalizować.
Pomóżcie, oto zapytanie.
SELECT firmy.nazwa_firmy, miasta.miasto FROM firmy JOIN miasta ON firmy.id_miasta = miasta.id_miasta WHERE id_firmy IN (SELECT id_firmy FROM produkt_firma WHERE id_produktu='577') AND miasta.id_miasta IN ( SELECT id_miasta FROM miasta WHERE dlugosc >=21.8 AND dlugosc <=22.6 AND szerokosc >= 49.42 AND szerokosc <= 51.04 AND (sqrt( POW(dlugosc-21.20563,2)+POW(szerokosc-50.56122,2) )<20*0.013994 ) ) AND status_firmy='1' ORDER BY rodzaj_konta_nr DESC, data_aktywacji ASC LIMIT 0, 100
ps. pewne rzeczy pominąłem i uprościłem a współrzędne geo są z rękawa bo nie mam na razie prawdziwych
ps ps. zdaje sobie sprawę że w zapytaniu jest zapewne wiele bezsensów