Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQL Query Untuk Poin Total Dalam Radius Lokasi

MySQL Guru atau tidak, masalahnya adalah jika Anda tidak menemukan cara untuk menyaring berbagai baris, jarak perlu dihitung antara setiap titik dan setiap kota...

Ada dua pendekatan umum yang dapat membantu situasi

  • sederhanakan rumus jarak
  • menyaring kandidat yang tidak mungkin sampai radius 100k dari kota tertentu

Sebelum masuk ke dua jalan peningkatan ini, Anda harus memutuskan tingkat presisi yang diinginkan sehubungan dengan jarak 100 mil ini, juga Anda harus menunjukkan area geografis mana yang tercakup oleh database (apakah ini hanya benua Amerika Serikat, dll.

Alasan untuk ini adalah bahwa meskipun secara numerik lebih tepat, rumus Lingkaran Besar, sangat mahal secara komputasi. Cara lain untuk peningkatan kinerja adalah dengan menyimpan semacam "Koordinat kisi" sebagai tambahan (atau sebagai ganti) koordinat Lintang/Bujur.

Sunting :
Beberapa ide tentang rumus yang lebih sederhana (tetapi kurang tepat) :
Karena kita berhadapan dengan jarak yang relatif kecil, (dan saya kira antara 30 dan 48 derajat Lintang Utara), kita dapat menggunakan jarak euclidean (atau lebih baik lagi kuadrat dari jarak euclidean) daripada rumus trigonometri bola yang lebih rumit.
bergantung pada tingkat presisi yang diharapkan, bahkan mungkin dapat diterima untuk memiliki satu parameter tunggal untuk jarak linier untuk derajat bujur penuh, mengambil sesuatu yang rata-rata di atas area yang dipertimbangkan (katakanlah sekitar 46 status mil). Rumusnya akan menjadi

  LatDegInMi = 69.0
  LongDegInMi = 46.0
  DistSquared = ((Lat1 - Lat2) * LatDegInMi) ^2 + ((Long1 - Long2) * LongDegInMi) ^2

Pada gagasan kolom dengan info kisi untuk memfilter untuk membatasi jumlah baris dipertimbangkan untuk penghitungan jarak.
Setiap "titik" dalam sistem, baik itu kota, atau titik lain (?lokasi pengiriman, lokasi penyimpanan... apa pun) diberi dua koordinat bilangan bulat yang menentukan kuadrat katakanlah 25 mil * 25 mil di mana titik itu terletak. Koordinat titik mana pun dalam jarak 100 mil dari titik referensi (kota tertentu), paling banyak +/- 4 pada arah x dan +/- 4 pada arah y. Kami kemudian dapat menulis kueri yang mirip dengan yang berikut

SELECT city, state, latitude, longitude, COUNT(*)
FROM zipcodes Z
JOIN points P 
  ON P.GridX IN (
    SELECT GridX - 4, GridX - 3, GridX - 2, GridX - 1, GridX, GridX +1, GridX + 2 GridX + 3, GridX +4
   FROM zipcode ZX WHERE Z.id = ZX.id)
  AND
   P.GridY IN (
    SELECT GridY - 4, GridY - 3, GridY - 2, GridY - 1, GridY, GridY +1, GridY + 2 GridY + 3, GridY +4
   FROM zipcode ZY WHERE Z.id = ZY.id)
WHERE P.Status = A
   AND ((Z.latitude - P.latitude) * LatDegInMi) ^2 
      + ((Z.longitude - P.longitude) * LongDegInMi) ^2 < (100^2)
GROUP BY city,state,latitude,longitude;

Perhatikan bahwa LongDegInMi dapat di-hardcode (sama untuk semua lokasi di benua AS), atau berasal dari catatan yang sesuai di tabel kode pos. Demikian pula, LatDegInMi dapat di-hardcode (sedikit perlu membuatnya bervariasi, karena tidak seperti yang lain, ini relatif konstan).

Alasan mengapa ini lebih cepat adalah karena untuk sebagian besar catatan dalam produk kartesius antara tabel kode pos dan tabel poin, kami tidak menghitung jarak sama sekali. Kami menghilangkannya berdasarkan nilai indeks (GridX dan GridY).

Ini membawa kita ke pertanyaan tentang indeks SQL mana yang akan dihasilkan. Yang pasti, kita mungkin ingin:- GridX + GridY + Status (pada tabel poin)- GridY + GridX + status (mungkin)- Kota + Negara Bagian + lintang + garis bujur + GridX + GridY pada tabel kode pos

Sebuah alternatif untuk grid adalah untuk "mengikat" batas garis lintang dan garis bujur yang akan kita pertimbangkan, berdasarkan garis lintang dan garis bujur kota tertentu. yaitu kondisi GABUNG menjadi rentang daripada IN :

JOIN points P 
  ON    P.latitude > (Z.Latitude - (100 / LatDegInMi)) 
    AND P.latitude < (Z.Latitude + (100 / LatDegInMi)) 
    AND P.longitude > (Z.longitude - (100 / LongDegInMi)) 
    AND P.longitude < (Z.longitude + (100 / LongDegInMi)) 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi MySQL RAND() – Menghasilkan Angka Acak di MySQL

  2. Apakah ada MySQL yang setara dengan PostgreSQL array_to_string

  3. MySQL melihat izin dan kesalahan definisi 1356

  4. Karakter Unicode menjadi tanda tanya setelah dimasukkan ke dalam database

  5. Saya tidak dapat memulai Server MySQL dari baris perintah di windows