Function in Datenbankabrage

Die Klammer habe ich entfernt, aber daran lag es leider auch nicht.

Mitlerweile habe ich es ja scho nsoweit, das er die zahlen 1-9 Sortiert, aber 0 ist jetzt nach der 9 und soll ja vor die 1.

Hast du dafür eine lösung ?

Gruß
Sascha
 
Sascha1976 hat gesagt.:
Die Klammer habe ich entfernt, aber daran lag es leider auch nicht.
Ist es derselbe Fehler?
Sascha1976 hat gesagt.:
Mitlerweile habe ich es ja scho nsoweit, das er die zahlen 1-9 Sortiert, aber 0 ist jetzt nach der 9 und soll ja vor die 1.

Hast du dafür eine lösung ?

Gruß
Sascha
Siehe Edit einen Thread vorher.

Gruß hpvw
 
Code:
1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '0) AS distance FROM users WHERE user_gender =

SELECT user_id, 6.76667 AS Lon, 51.2167 AS Lat, user_membername, user_longitude AS toLon, user_latitude AS toLat, (Lon/360*2*PI()) AS Lo1, (toLon/360*2*PI()) AS toLo2, (Lat/360*2*PI()) AS La1, (toLat/360*2*PI()) AS toLa2, ((SIN(La1)*SIN(toLa2))+(COS(La1)*COS(toLa2)*COS(toLo2-Lo1))) AS eTemp, (ATAN(SQRT(1-(eTemp*eTemp)) /eTemp)) AS e, (ROUND((ABS( 6378137*2*PI()* (360/(2*PI())*e))/360)/1000),0) AS distance FROM users WHERE user_gender = 1 ORDER BY distance

[SQL Error]

Gruß
Sascha
 
Jetzt hab ich doch noch mal den Laptop rausgekramt, auf dem ich zur Zeit noch 'nen laufenden Webserver habe.

Ich habe das ganze noch etwas gekürzt und die WHERE-Klausel entfernt. Tut ja auch nicht Not, bei meinen 3 Testeinträgen.

Zuerst die schlechte Nachricht.
Ich habe die Syntaxfehler soweit raus, aber es klappt nicht:
PHP:
    $onuser_query =mysql_query("SELECT
        user_id,
        user_membername,
        (".$geo1_longitude."/360*2*PI()) AS Lo1,
        (user_longitude/360*2*PI()) AS toLo2,
        (".$geo1_latitude."/360*2*PI()) AS La1,
        (user_latitude/360*2*PI()) AS toLa2,
        ((SIN(La1)*SIN(toLa2))+(COS(La1)*COS(toLa2)*COS(toLo2-Lo1)))
        AS eTemp,
        (ATAN(SQRT(1-(eTemp*eTemp)) /eTemp)) AS e,
        (ROUND((ABS( 6378137*2*PI()* (360/(2*PI())*e))/360)/1000),0)
        AS distance
        FROM users
        ORDER BY distance");

Fehlermeldung: 1054 Unknown column 'La1' in 'field list'
Nach Studium des MySQL-Manuals ist das zumindest nachzuvollziehen. Es steht zwar nicht direkt dort, dass man Aliasnamen nicht in weiteren Select-Ausdrücken verwenden darf, aber z.B. in der WHERE-Klausel ist es verboten, also vermutlich auch hier.

Und jetzt die gute Nachricht:
Es geht, wenn man alles in eine Anweisung schreibt:
PHP:
    $onuser_query =mysql_query("SELECT
        user_id,
        (
            ROUND(
                (
                    ABS(
                        6378137*2*PI(
                        )
                        *
                        (
                            360/(
                                2*PI(
                                )
                            )
                            *
                            (
                                ATAN(
                                    SQRT(
                                        1
                                        -
                                        (
                                            (
                                                (
                                                    SIN(
                                                        (
                                                            ".$geo1_latitude."/360*2*PI(
                                                            )
                                                        )
                                                    )
                                                    *
                                                    SIN(
                                                        (
                                                            user_latitude/360*2*PI(
                                                            )
                                                        )
                                                    )
                                                )
                                                +
                                                (
                                                    COS(
                                                        (
                                                            ".$geo1_latitude."/360*2*PI(
                                                            )
                                                        )
                                                    )
                                                    *
                                                    COS(
                                                        (
                                                            user_latitude/360*2*PI(
                                                            )
                                                        )
                                                    )
                                                    *
                                                    COS(
                                                        (
                                                            user_longitude/360*2*PI(
                                                            )
                                                        )
                                                        -
                                                        (
                                                            ".$geo1_longitude."/360*2*PI(
                                                            )
                                                        )
                                                    )
                                                )
                                            )*(
                                                (
                                                    SIN(
                                                        (
                                                            ".$geo1_latitude."/360*2*PI(
                                                            )
                                                        )
                                                    )
                                                    *
                                                    SIN(
                                                        (
                                                            user_latitude/360*2*PI(
                                                            )
                                                        )
                                                    )
                                                )
                                                +
                                                (
                                                    COS(
                                                        (
                                                            ".$geo1_latitude."/360*2*PI(
                                                            )
                                                        )
                                                    )
                                                    *
                                                    COS(
                                                        (
                                                            user_latitude/360*2*PI(
                                                            )
                                                        )
                                                    )
                                                    *
                                                    COS(
                                                        (
                                                            user_longitude/360*2*PI(
                                                            )
                                                        )
                                                        -
                                                        (
                                                            ".$geo1_longitude."/360*2*PI(
                                                            )
                                                        )
                                                    )
                                                )
                                            )
                                        )
                                    )
                                    /
                                    (
                                        (
                                            SIN(
                                                (
                                                    ".$geo1_latitude."/360*2*PI(
                                                    )
                                                )
                                            )
                                            *
                                            SIN(
                                                (
                                                    user_latitude/360*2*PI(
                                                    )
                                                )
                                            )
                                        )
                                        +
                                        (
                                            COS(
                                                (
                                                    ".$geo1_latitude."/360*2*PI(
                                                    )
                                                )
                                            )
                                            *
                                            COS(
                                                (
                                                    user_latitude/360*2*PI(
                                                    )
                                                )
                                            )
                                            *
                                            COS(
                                                (
                                                    user_longitude/360*2*PI(
                                                    )
                                                )
                                                -
                                                (
                                                    ".$geo1_longitude."/360*2*PI(
                                                    )
                                                )
                                            )
                                        )
                                    )
                                )
                            )
                        )
                    )
                    /
                    360
                )
                /
                1000
            )
        )
        AS distance,
        user_membername
        FROM users
        ORDER BY distance;");

Dazu muss man nur noch bedenken, dass ich mich bei ROUND geirrt habe, irgendwie kann man da doch keinen weiteren Parameter anfügen.

Du musst jetzt noch Dein WHERE wieder einfügen und Deine Konstante users für den Tabellennamen wieder einbauen. Das ganze musst Du dann anstelle des Queryaufrus in meinem letzten Skript einfügen. Das sollte es dann eigentlich gewesen sein.

Ich habe das ganze jetzt etwas extrem eingerückt, aber ich wollte den Überblick über die Klammern behalten. Du kannst gerne überflüssige Zeilenumbrüche und Leerzeichen entfernen :)

Gruß hpvw
 
Hallo,
erstmal 1000 Dank. Das du mir geholfen hast. Der Code funktioniert 1a :)

Könntest du mir nur noch einen gefallen tun ?

Und mir die folgende Function auf deine formel umschreiben ?
PHP:
function geo_distance ($longitude_1, $latitude_1, $longitude_2, $latitude_2) 
{ 
    $earth_radius = 6378137.0; 

    $long1 = deg2rad ($longitude_1); 
    $long2 = deg2rad ($longitude_2); 
    $lat1 = deg2rad ($latitude_1); 
    $lat2 = deg2rad ($latitude_2); 

    $dlon = $long2 - $long1; 
    $dlat = $lat2 - $lat1; 
    $a = pow( sin($dlat / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($dlon / 2), 2); 
    $d = 2 * atan2(sqrt($a), sqrt(1 - $a)); 

    return $earth_radius * $d; 
}

Damit auch da die entfernung gleich ist zu deiner berechnung.

Da bei deiner formel der kürzeste weg genommen wir und bei der oberen anscheinend nicht.

Jetzt fehlt mir nur noch eine Seite wo ich zu den Postleitzahlen auch die entsprechenden Geowerte her bekomme.

Opengeodb hat ja leider nur die für Städte und nicht die zu jeder Postleitzahl.

Gruß
Sascha
 
Sascha1976 hat gesagt.:
Hallo,
erstmal 1000 Dank. Das du mir geholfen hast. Der Code funktioniert 1a :)
Gerngeschehen, das Problem hat mich gereizt!

Sascha1976 hat gesagt.:
Könntest du mir nur noch einen gefallen tun ?

Und mir die folgende Function auf deine formel umschreiben ?
Im Prinzip ja, aber
Ich bin mir jetzt nicht ganz sicher, was Du willst
Deine Formel in SQL oder Meine Formel in PHP?

Innerhalb Deutschlands spielt das übrigends fast keine Rolle.

Sascha1976 hat gesagt.:
Da bei deiner formel der kürzeste weg genommen wir und bei der oberen anscheinend nicht.
Bei Deiner Formel wird, wenn ich die Ergebnisse richtig interpretiere, der Weg bei gleichem Kurs genommen.
Also wenn ich von Berlin nach Calgery (Kanada) fliege wird bei Deiner Formel annähernd mit einem Kurs von 270° geflogen. Bei meiner Formel wird der Flug irgendwo zwischen 270° und 360° begonnen, es geht über Grönland oder sogar noch nördlicher und der Anflug auf Calgery findet mit 180° bis 270° statt.
Das heisst innerhalb Europas werden die Unterschiede minimal sein. Von La Rochelle nach Warschau wird man wohl noch einen Unterschied feststellen können, vom Nordkap nach Athen wird es überhaupt keinen Unterschied geben.

Das nur mal etwas Offtopic als Hintergrund, falls Du es noch nicht wusstest.

Beide Formeln haben ihre Vorzüge, in meiner Navisoftware (Wassersport, nicht PKW) habe ich die kürzeste Weg Formel genommen, die meisten handelsüblichen GPS-Geräte rechnen mit Kursgleichen Routen. Aber innerhalb der Ostsee ist das auch egal.

Sascha1976 hat gesagt.:
Jetzt fehlt mir nur noch eine Seite wo ich zu den Postleitzahlen auch die entsprechenden Geowerte her bekomme.

Opengeodb hat ja leider nur die für Städte und nicht die zu jeder Postleitzahl.
Links, bitte Links! So eine DB hätte ich auch gerne zur Verfügung.

Gruß hpvw
 
Zurück