# MySQL die Ausgabe berechnen lassen anhand von PHP Variablen - möglich?



## preko (15. Juli 2009)

Hi,

ich möchte eine Datenbankabfrage einsetzen, die anhand von PHP Variablen eine Berechnung ausführt und anhand dieser Berechnung eine Query generiert.

Ich schreibe es mal so dar wie ich es mir vorstelle - vielleicht versteht man es besser:

```
$lat_1 = '5';
$lat_2 = '7';
$lng_1 = '8';
$lng_2 = '9';
$entf = '40';
$pi = '3.14';
$A = '5.9';
...
    $sql_query = ("SELECT 
                              * 
                   FROM 
                              `database` 
                   WHERE 

// Hier in der WHERE-Klausel soll nun die Formelberechnung umgesetzt werden - ANFANG

(((acos(sin($lat_1)*sin($lat_2)+cos($lat_1)*cos($lat_2)*cos($lng_2-$lng_1)))180*$pi)*$A) <= $entf

// Formelberechnung - ENDE

                   ORDER BY
                              'point' ASC	
                   "); 
    $result = mysql_query($sql_query);
	while( $row = mysql_fetch_array($result,MYSQL_ASSOC) ) {
                     echo $row['point']."<br />";
}
...
```
MySQL soll also anhand dieser Formel die Ausgabe filtern, so dass MySQL die Rechenarbeit leistet und diese nicht über das PHP Script geleistet wird. Ich verspreche mir dadurch eine bessere Performance bei größeren Zugriffszahlen.

Vielleicht hat jemand eine zündende Idee für mich.


Beste Grüße,
preko


----------



## Dr Dau (15. Juli 2009)

Hallo!

Keine zündene Idee..... aber den Hinweis dass es für die Variable $pi auch eine Funktion gibt. 

Gruss Dr Dau

[edit]
Eine Idee hätte ich doch.
Die Abfrage führt so zum gewünschten Ergebnis?
Dann würde ich mal gucken was passiert wenn Du die mathematischen PHP-Funktionen in der php.ini oder per ini_set() deaktivierst (Abschnitt: disable_functions).
Soweit ich weiss gibt es diese nämlich auch in MySQL.
Dann müssten sie für PHP eigentlich ein einfacher String sein und MySQL müsste sie als Fünktionen ansehen.
Keine Ahnung ob es funktioniert..... aber ein Versuch wäre es wert. 
[/edit]


----------



## kuddeldaddeldu (15. Juli 2009)

Hi,

ich verstehe ehrlich gesagt das Problem gar nicht. Klar kann auch MySQL solche Berechnungen durchführen. Schau halt in den numerischen Funktionen nach. 
Ich sehe in dieser Formel allerdings keinen einzigen Spaltennamen. Was soll MySQL da filtern? Du bekommst entweder alle Datensätze oder keinen...

LG


----------



## preko (16. Juli 2009)

Hi,

*@ kuddeldaddeldu*:

sorry, mein Fehler - habe mein Denkmodell reinkopiert und nicht die Realsituation. 

Hier nun die richtige Darstellung:

```
/* 
Spalten in der MySQL Tabelle:
lat_2 | lng_2 | city
*/
 
$lat_1 = '5'; 
$lng_1 = '8'; 
$entf = '40'; 
$pi = '3.14'; 
$A = '5.9'; 
... 
    $sql_query = ("SELECT  
                              `lat_2`,
                              `lng_2`,
                              `city`,
                   FROM  
                              `database`  
                   WHERE  

// Hier in der WHERE-Klausel soll nun die Formelberechnung umgesetzt werden - ANFANG 

(((acos(sin($lat_1)*sin(lat_2)+cos($lat_1)*cos(lat_2)*cos(lng_2-$lng_1)))180*$pi)*$A) <= $entf 

// Formelberechnung - ENDE 

                   ORDER BY 
                              //Hier soll das Ergebnis aus der obigen Formel rein// ASC     
                   ");  
    $result = mysql_query($sql_query); 
    while( $row = mysql_fetch_array($result,MYSQL_ASSOC) ) { 
                     echo $row['point']."<br />"; 
} 
...
```

*@Dr. Dau*:

Die Abfrage führt so nicht zum gewünschten Ergebnis (ich vermute Du hinterfragst die Syntax). Ist nur ein Ausdruck dessen, was ich bezwecken möchte. Allerdings ist die Formel als solche korrekt - mit PHP funktioniert sie!

Ich möchte per MySQL alle Orte abrufen, die in einem bestimmten Radius um einen Ausgangspunkt liegen und dann eine Sortierung in aufsteigender Folge nach Entfernungskilometern realisieren.
Damit nun MySQL nicht die ganze Tabelle einliest (welche bei meinem Vorhaben ziemlich groß werden könnte), soll eine "Vorauswahl" der Datensätze getroffen werden, die dann weiter von PHP verarbeitet wird.

Lasse ich die Berechnung nicht durch MySQL abarbeiten, so muss ich erst PHP drüberjagen, damit ich eine Sortierung nach Entfernungskilometern realisieren kann, da die Daten in der Datenbank "nur" die Längen- und Breitengrade enthalten und daraus erst anhand der Formel oben die tatsächlichen Entfernungskilometer berechnet werden.

Übrigens arbeite ich mit einer ausführlicheren Zahl PI - habe es aus einfachheitsgründen abgekürzt. 


Beste Grüße,
preko


----------



## kuddeldaddeldu (16. Juli 2009)

Hi,



preko hat gesagt.:


> Die Abfrage führt so nicht zum gewünschten Ergebnis



Das ist ein wenig ungenau...
Poste doch bitte mal die konkret abgesetzte Abfrage und zu welchem unerwarteten Ergebnis sie denn führt. Beispieldaten?

LG


----------

