[]
MySQL sorusu
selam arkadaşlar. çıkamadım içinden.
şimdi amacım şu;
kullanıcının mevcut koordinatını alacağım.
ve mysql'den de, bu koordinata en yakın firmaları harita üstünde listeleteceğim.
Ancak şöyle bir durum var; firmaların hiç koordinat girmemiş olma ihtimali var. ben onları, koordinat girmişlerin altına atmak istiyorum her halükarda. yani mesafe yakın da uzak da olsa önce koordinatı girili firmalar sıralanacak. sonra değeri null olanlar.
firma ile kullanıcı arasındaki mesafeyi çok kabataslak hesaplayıp ona göre ORDER yapıyorum.
ama bu durumda NULL değerleri 0 aldığı için, en yakınlar NULL lar arasından geliyor.
bu meseleyi nasıl çözebilirim sizce?
aha örnek query: (değiştirdim biraz anlaşılır olması için, traşladım)
select
ABS(ABS(fm.firmaX-'41.0708726')-ABS(fm.firmaY-'28.995797099999997')) as mesafe,
fm.firmaId,
fm.firmaTitle,
fm.firmaDesc,
fm.firmaLogo,
fm.firmaYil,
fm.firmaNo,
fm.firmaIl,
fm.firmaIlce
from (select * from firma) as fm
LEFT JOIN firmakategori as fk ON fk.firmakategoriId = fm.firmakategoriId order by fm.firmaX desc, mesafe limit 0, 4
şimdi amacım şu;
kullanıcının mevcut koordinatını alacağım.
ve mysql'den de, bu koordinata en yakın firmaları harita üstünde listeleteceğim.
Ancak şöyle bir durum var; firmaların hiç koordinat girmemiş olma ihtimali var. ben onları, koordinat girmişlerin altına atmak istiyorum her halükarda. yani mesafe yakın da uzak da olsa önce koordinatı girili firmalar sıralanacak. sonra değeri null olanlar.
firma ile kullanıcı arasındaki mesafeyi çok kabataslak hesaplayıp ona göre ORDER yapıyorum.
ama bu durumda NULL değerleri 0 aldığı için, en yakınlar NULL lar arasından geliyor.
bu meseleyi nasıl çözebilirim sizce?
aha örnek query: (değiştirdim biraz anlaşılır olması için, traşladım)
select
ABS(ABS(fm.firmaX-'41.0708726')-ABS(fm.firmaY-'28.995797099999997')) as mesafe,
fm.firmaId,
fm.firmaTitle,
fm.firmaDesc,
fm.firmaLogo,
fm.firmaYil,
fm.firmaNo,
fm.firmaIl,
fm.firmaIlce
from (select * from firma) as fm
LEFT JOIN firmakategori as fk ON fk.firmakategoriId = fm.firmakategoriId order by fm.firmaX desc, mesafe limit 0, 4
.... ABS(ISNULL(fm.firmaX, 10000) - '41.0708726') ....
ISNULL mssql de var, mySql de de vardır diye tahmin ediyorum.
ISNULL mssql de var, mySql de de vardır diye tahmin ediyorum.
- ravenudon (12.07.17 10:01:11 ~ 10:01:43)
daha önce kullanmadım isnull'u.
buradaki fonksiyonu nolmuş oluyor acaba?
buradaki fonksiyonu nolmuş oluyor acaba?
- tchuck (12.07.17 10:23:04)
Fromdan sonra where fm.x not null ekle
- beriberi (12.07.17 10:46:37)
ISNULL değil de IFNULL(fm.firmaX, 12345) şeklinde kullanabilirsin.
Eğer fm.firmaX değeri NULL gelirse 12345 çıkar fonksiyondan, değilse kendi değeri çıkar zaten.
Eğer fm.firmaX değeri NULL gelirse 12345 çıkar fonksiyondan, değilse kendi değeri çıkar zaten.
- chicha (12.07.17 10:56:37)
Benzer bir sql sorgusu gelistirmistim. databasede veri sayisi 10.000 sayisini gectikten sonra cok yavasladi. Cunku mesafe hesaplama fonksiyonu 10.000 data icin ayri ayri calismali, merkez noktasi da hep degistigi icin de mysql cache de bir anlam tasimiyor. ornegin bu verdigin sql sorgusunda istanbuldaki bir kisiye olan uzakligi almak istediginde erzurumdaki bir data icin de mesafe hesaplama formulu calisir. Bu da ekstra zaman kaybi. Data sayisi artinca performans cok kotu olacaktir ve performans kaybi katlanarak artacaktir.
Cozum olarak ilk basta sehir olarak filtreleyelim dedik. ornegin istanbul merkezli arama yapinca ilk once istanbuldaki datalari filtreleyip, sadece o datalarin mesafesini hesaplayalim dedik. Boylce baska sehirlerdeki datalara olan mesafeyi hesaplamamis olduk. Ama bu durumda da tuzladan(istanbul) biri arama yaptiginda gebzedeki(izmit) sonuclar cikmadi dogal olarak. Bu cozum mantikli degildi ve eledik.
Onun yerine en verimli cozum su oldu, ornegin latitude:45 longitude:75 olan bir yerin mesafesini hesaplaman icin sql de "where" blogunun icine su sekilde filtre eklersen
and latitude > 40.00
and latitude < 50.00
and longitude > 70.00
and longitude < 80.00
yani sadece tum dataya olan mesafeyi hesaplemk yerine belli bir kare alan icindekilerin mesafesini hesaplar isen cok daha hizli sonuc verecektir sql. biz bu sayede ABD icinde lokasyonlarin mesafe hesaplamasini sql optimizasyondan once 120 saniyede aldigimiz sonucu 6 saniye kadar dusurduk.
Hele bir de rotaya olan uzakligi hesaplamak istediginde bu formul de cok yeterli gelmeyecktir, bu durumda bunun gibi Route Boxer js-tutorial.com ve bu tez gibi kaynaklara ihtiyac duyabilirsin ieeexplore.ieee.org
Cozum olarak ilk basta sehir olarak filtreleyelim dedik. ornegin istanbul merkezli arama yapinca ilk once istanbuldaki datalari filtreleyip, sadece o datalarin mesafesini hesaplayalim dedik. Boylce baska sehirlerdeki datalara olan mesafeyi hesaplamamis olduk. Ama bu durumda da tuzladan(istanbul) biri arama yaptiginda gebzedeki(izmit) sonuclar cikmadi dogal olarak. Bu cozum mantikli degildi ve eledik.
Onun yerine en verimli cozum su oldu, ornegin latitude:45 longitude:75 olan bir yerin mesafesini hesaplaman icin sql de "where" blogunun icine su sekilde filtre eklersen
and latitude > 40.00
and latitude < 50.00
and longitude > 70.00
and longitude < 80.00
yani sadece tum dataya olan mesafeyi hesaplemk yerine belli bir kare alan icindekilerin mesafesini hesaplar isen cok daha hizli sonuc verecektir sql. biz bu sayede ABD icinde lokasyonlarin mesafe hesaplamasini sql optimizasyondan once 120 saniyede aldigimiz sonucu 6 saniye kadar dusurduk.
Hele bir de rotaya olan uzakligi hesaplamak istediginde bu formul de cok yeterli gelmeyecktir, bu durumda bunun gibi Route Boxer js-tutorial.com ve bu tez gibi kaynaklara ihtiyac duyabilirsin ieeexplore.ieee.org
- emrahday (12.07.17 13:02:59)
1