Radiussuche

Hallo zusammen,

ich stehe vor einem Problem. Ich will aus der MySQL Datenbank alle Parkplätze (Beispiel) innerhalb von 15 miles anhand meiner aktuellen Koordinaten ausfindig machen.

// Beispiel string(11) "51.22774110" string(10) "6.77345560"
Dies geht am besten so:

SELECT , (3959 acos(cos(radians('".$lat."')) cos(radians(lat)) cos( radians(long) - radians('".$lng."')) + sin(radians('".$lat."')) * sin(radians(lat)))) AS distance FROM carpark WHERE distance < 15 ORDER BY distance
Nun mein Problem ist es, dass ich die Koordinaten des Parkplatzes nicht unter „carpark“ gespeichert habe, sondern in einer anderen Tabelle „location“. Unter „carpark“ ist nur „location_id“ statt „long“ und „lat“. In der location Tabelle wiederum gibt es die Spalten „id“, „long“, „lat“, „zipcode“, …

Es muss irgendwie also erst einmal ein Join gemacht werden um die „Location“'s zu holen und anschliessend wird anhand der Location Id’s die ganzen Parkplätze geholt. Wie kann ich das in einer SQL Abfrage? Ich will nicht die Koordinaten doppelt speichern, in dem sie auch noch bei „carpark“ zu finden sind. Das wichtigste von allen ist, die SQL Frage. Denn unter carpark sind insgesamt sehr sehr viele Datensätze. Das könnte irgendwann > 1 000 000 sein. Natürlich werde ich einen Limit auf maximal 1000 setzen je Abfrage.

Bei dir könnte das ungefähr so aussehen:

SELECT ... FROM carpark JOIN location ON (carpark.location_id = location.id) WHERE distance < 15 GROUP BY carpark.id

Wenn du nicht klar kommst, wäre es gut wenn du einen mysqldump zur Verfügung stellen könntest.

Ja so ungefähr, wenn er die Daten als Number und nicht als String gespeichert hat, wie das in seinem Beispiel den Eindruck machen könnte.:wink:

Das ist nur ein PHP var_dump. Außerdem wird es so oder so zum String bevor es MySQL „erreicht“:
[PHP]var_dump('SELECT … FROM … WHERE 1 = ’ . 1);
// string(128) „SELECT … FROM … WHERE 1 = 1“[/PHP]

http://dev.mysql.com/doc/refman/5.7/en/type-conversion.html
Das funktioniert zB auch:

SELECT * FROM a WHERE 1 = '1';

Oha, das wusste ich nicht. Ich habe früher nur mit IBM DB2 und Oracle DB gearbeitet und die waren da sehr streng , was die Typen anging. mySql verwende ich nur rudimentär und dann natürlich in der strengen Art, die mir anerzogen wurde :D.

Davon abgesehen war das Wichtige an deinem Hinweis ja der Join, und das hat pet ja sicher auch so erkannt und umgesetzt.