Heim > Fragen und Antworten > Hauptteil
Ich habe eine MySQL-Tabelle mit den Spalten „Region“ und „Breitengrad/Längengrad“. In jedem Gebiet gibt es viele Orte, wie zum Beispiel 20.000
。有没有办法只选择几个,比如 100
, die scheinbar gleichmäßig auf der Karte verteilt sind?
Die Verteilung muss nicht perfekt sein, die Abfragegeschwindigkeit ist wichtiger. Sollte dies mit MySQL nicht direkt möglich sein, kann ein sehr schneller Algorithmus verwendet werden, um gleichmäßig verteilte Standorte auszuwählen.
Vielen Dank im Voraus.
EDIT: Beantwortung einiger Anfragen in den Kommentaren. Die Daten haben nichts, mit dem man arbeiten kann, es sind lediglich die Gebiets- und Standortkoordinaten, zum Beispiel:
+-------+--------------+----------+-----------+------------+--------+--------+ | 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 | +-------+--------------+----------+-----------+------------+--------+--------+
Es gibt auch einige Spalten mit Merkmalen, diese dienen jedoch nur der Filterung.
Ich habe versucht, beide nth
Reihen zu bekommen und es scheint zu funktionieren, wenn auch etwas langsam
SET @a = 0; select * from `locations` where (@a := @a + 1) % 200 = 0
Die Verwendung von random()
funktioniert auch, ist aber etwas langsam.
EDIT 2: Es stellt sich heraus, dass das Hinzufügen von Postleitzahlen zu einem Formular einfach ist. Dabei scheint die Gruppierung nach Postleitzahl ein erfreuliches Ergebnis zu liefern. Das einzige Problem ist, dass es sehr große Gebiete gibt, etwa 3000 verschiedene Postleitzahlen, und wenn man nur 100 davon hat, kann es sein, dass viele von ihnen an einem Ort angezeigt werden, sodass möglicherweise eine weitere Verarbeitung in PHP erforderlich ist.
Bearbeiten3, beantworte die Fragen von @RickJames in den Kommentaren, damit sie an einem Ort sind:
AUTO_INCRMENT
Ausweis und es kann Lücken geben 1000
,我们希望仅显示随机的 100
。如果 1000
oder weniger beträgt, können wir einfach alles anzeigen P粉9820544492024-02-27 00:20:37
这是一种可以满足目标的方法。
至于“重复项”,请将此视为发现两个项目落在同一位置的粗略方法:
SELECT ROUND(latitude * 5), ROUND(longitude * 3), MIN(id) AS id_to_keep FROM tbl GROUP BY 1,2
“5”和“3”可以向上(或向下)调整,以保留更多(或更少)的 id。由于纬度/经度的排列方式,“5”和“3”是不同的;这个比例可能适用于大多数温带地区。 (在赤道附近使用相同的数量,在更高纬度使用更大的配给。)
有一个小缺陷...两个非常接近的项目可能会跨越由 ROUNDs
创建的边界。
原表有多少行?上述查询生成了多少行? ( SELECT COUNT(*) FROM ( ... ) x;
)