Rumah > Soal Jawab > teks badan
Saya mempunyai jadual MySQL dengan lajur lokasi wilayah dan latitud/longitud. Setiap kawasan mempunyai banyak lokasi, seperti 20.000
。有没有办法只选择几个,比如 100
, yang kelihatan sekata pada peta?
Pengedaran tidak semestinya sempurna, kelajuan pertanyaan adalah lebih penting. Jika ini tidak dapat dilakukan menggunakan MySQL secara langsung, algoritma yang sangat pantas boleh digunakan untuk memilih lokasi teragih sama rata.
Terima kasih terlebih dahulu.
EDIT: Menjawab beberapa permintaan dalam ulasan. Data tidak mempunyai apa-apa untuk digunakan, ia hanya koordinat kawasan dan lokasi, sebagai contoh:
+-------+--------------+----------+-----------+------------+--------+--------+ | id | area | postcode | lat | lon | colour | size | +-------+--------------+----------+-----------+------------+--------+--------+ | 16895 | Athens | 10431 | 37.983917 | 23.7293599 | red | big | | 16995 | Athens | 11523 | 37.883917 | 23.8293599 | green | medium | | 16996 | Athens | 10432 | 37.783917 | 23.7293599 | yellow | small | | 17000 | Thessaloniki | 54453 | 40.783917 | 22.7293599 | green | small | +-------+--------------+----------+-----------+------------+--------+--------+
Terdapat juga beberapa lajur dengan ciri, tetapi ini hanya digunakan untuk penapisan.
Saya cuba mendapatkan kedua-dua baris nth
dan nampaknya berkesan, walaupun agak perlahan
SET @a = 0; select * from `locations` where (@a := @a + 1) % 200 = 0
Menggunakan random()
juga berfungsi, tetapi ia agak perlahan.
EDIT 2: Ternyata menambah kod zip pada borang adalah mudah. Dengan ini, pengumpulan mengikut kod zip nampaknya memberikan hasil yang menggembirakan. Satu-satunya masalah ialah, terdapat kawasan yang sangat besar, sekitar 3000 poskod yang berbeza, dan hanya mendapat 100 daripadanya mungkin berakhir dengan banyak daripadanya muncul di satu tempat, jadi yang mungkin memerlukan pemprosesan lanjut dalam PHP.
Edit3, jawab soalan @RickJames dalam ulasan supaya mereka berada di satu tempat:
AUTO_INCRMENT
id dan mungkin ada jurang 1000
,我们希望仅显示随机的 100
。如果 1000
atau kurang, kita boleh tunjukkan semuanya P粉9820544492024-02-27 00:20:37
Ini adalah cara yang boleh memenuhi matlamat anda.
Bagi "pendua", anggap ini sebagai cara kasar untuk melihat dua item jatuh ke tempat yang sama:
SELECT ROUND(latitude * 5), ROUND(longitude * 3), MIN(id) AS id_to_keep FROM tbl GROUP BY 1,2
"5" dan "3" boleh dilaraskan ke atas (atau ke bawah) untuk mengekalkan lebih banyak (atau kurang) id. Oleh kerana susunan latitud/longitud, "5" dan "3" adalah berbeza; (Gunakan jumlah yang sama berhampiran khatulistiwa, gunakan catuan yang lebih besar di latitud yang lebih tinggi.)
Ada kecacatan kecil...dua item yang sangat rapat mungkin melintasi sempadan yang dicipta oleh ROUNDs
.
Berapa banyak baris jadual asal? Berapakah bilangan baris yang dijana oleh pertanyaan di atas? ( SELECT COUNT(*) FROM ( ... ) x;
)