Max
Anmeldedatum: 21.05.2008 Beiträge: 1
|
Verfasst am: 21.05.2008, 08:41 Titel: Umkreissuche mit Krücke |
|
|
Hallo zusammen,
ich habe eine Umkreissuche nach meinen Bedürfnissen umgebaut und habe damit große Performanceprobleme. Leider ist SQL nicht so mein Steckenpferd, daher habe ich eine entscheidende Stelle der Abfrage in PHP mit Schleifen und Arrays erstellt und damit ein bottleneck erzeugt. Ich bitte um Hilfe bei einer Lösung in SQL. Hier mein bisheriger Quellcode, der richtige Ergebnisse liefert aber eben viel zu lange braucht:
[code]
function PLZUmkreissuche($form_plz, $umkreis)
{
$sql="SELECT * FROM signup WHERE emailverified='yes' AND UID !=".$_SESSION[UID].")";
$rs = $conn->execute($sql);
while(!$rs->EOF)
{
$db_plz=$rs->fields['zip'];
//-----------Berechnung der Distanz von DB_PLZ zu Form_PLZ mit Hilfe von Werten aus openGeoDB---------------------
$sql2 = "
SELECT
DEGREES(
ACOS(
SIN(RADIANS(c1.lat)) * SIN(RADIANS(c2.lat))
+ COS(RADIANS(c1.lat)) * COS(RADIANS(c2.lat))
* COS(RADIANS(c1.lon - c2.lon))
) * 60 * 1.85201
) AS distance
FROM
geodb_textdata t1,
geodb_textdata t2,
geodb_coordinates c1,
geodb_coordinates c2
WHERE
t1.text_type = 500300000
AND t2.text_type = 500300000
AND t1.text_val = $form_plz
AND t2.text_val = $db_plz
AND c1.loc_id = t1.loc_id
AND c2.loc_id = t2.loc_id
";
$rs2 = $conn->execute($sql2);
//---------Einfügen der Werte in ein Mehrdimensionales Array------------
if(round($rs2->fields['distance']) <= $umkreis){
$data[] = array('UID' => $rs->fields['UID'], 'email' => $rs->fields['email'], 'username' => $rs->fields['username'], 'Distance' => round($rs2->fields['distance']));
}
$rs->movenext();
}
//-------------- Anordnung im Array abändern damit nach der Distanz geordnet werden kann-----------------
if($data){
foreach ($data as $key => $row) {
$UID[$key] = $row['UID'];
$email[$key] = $row['email'];
$username[$key] = $row['username'];
$Distance[$key] = $row['distance'];
}
//------------Sortiert die Werte im Array nach der Distanz aufsteigend
array_multisort($Distance, SORT_DESC, $UID, SORT_ASC, $email, SORT_ASC, $username, SORT_ASC, $data);
return $data;
}else{
return -1;
}
}
[/code] |
|