J'ai une table MySQL avec des colonnes de région et de localisation latitude/longitude. Chaque zone comporte de nombreux emplacements, tels que 20.000
。有没有办法只选择几个,比如 100
, qui semblent être répartis uniformément sur la carte ?
La distribution ne doit pas nécessairement être parfaite, la vitesse des requêtes est plus importante. Si cela n'est pas possible en utilisant directement MySQL, un algorithme très rapide peut être utilisé pour sélectionner des emplacements uniformément répartis.
Merci d'avance.
EDIT : Je réponds à certaines demandes dans les commentaires. Les données n'ont rien avec quoi travailler, ce sont juste les coordonnées de la zone et de l'emplacement, par exemple :
+-------+--------------+----------+-----------+------------+--------+--------+ | 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 | +-------+--------------+----------+-----------+------------+--------+--------+
Il existe également des colonnes avec des caractéristiques, mais celles-ci ne sont utilisées que pour le filtrage.
J'ai essayé d'obtenir les deux lignes nth
et cela semble fonctionner, bien qu'un peu lent
SET @a = 0; select * from `locations` where (@a := @a + 1) % 200 = 0
Utiliser random()
fonctionne également, mais c'est un peu lent.
EDIT 2 : Il s'avère que l'ajout de codes postaux sur un formulaire est facile. Avec cela, le regroupement par code postal semble donner un résultat satisfaisant. Le seul problème est qu'il existe de très grandes zones, environ 3 000 codes postaux différents, et en obtenir seulement 100 pourrait aboutir à ce que beaucoup d'entre eux apparaissent au même endroit, ce qui pourrait nécessiter un traitement supplémentaire en PHP.
Edit3, répondez aux questions de @RickJames dans les commentaires pour qu'elles soient au même endroit :
AUTO_INCRMENT
identifiant et il peut y avoir des lacunes 1000
,我们希望仅显示随机的 100
。如果 1000
ou inférieur, nous pouvons simplement tout montrer
C'est une façon qui peut atteindre vos objectifs.
En ce qui concerne les « doublons », considérez-les comme un moyen approximatif de repérer deux éléments tombant au même endroit :
"5" et "3" peuvent être ajustés vers le haut (ou vers le bas) pour conserver plus (ou moins) d'identifiants. En raison de la disposition latitude/longitude, « 5 » et « 3 » sont différents ; ce rapport est probablement vrai pour la plupart des régions tempérées. (Utilisez les mêmes quantités près de l'équateur, utilisez des rations plus importantes aux latitudes plus élevées.)
Il y a un petit défaut... deux éléments très proches peuvent franchir une frontière créée par
ROUNDs
.Combien de lignes le tableau d'origine comporte-t-il ? Combien de lignes la requête ci-dessus a-t-elle générée ? (
SELECT COUNT(*) FROM ( ... ) x;
)