MYSQL Abfrage / Koordinaten / sortieren

  • SQL

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von PhilippHH.

    MYSQL Abfrage / Koordinaten / sortieren

    Hallo liebes Forum,

    Ich war lange abwesend hier, nur habe ich leider damals mein Konto gelöscht =(

    Nun zu meinem Problem:

    Ich habe eine Mysql Datenbank in einer Form, welche Datensätze mit Koordinaten (lat und lon) beinhaltet.
    Nun habe ich eine Form in der oben zwei TextBoxen sind in der die Koordinaten eines Ortes sind.
    Nun möchte ich den Datensatz abfragen in der Reihenfolge welcher Datensatz am nächsten dran ist.

    Ich habe alle möglcihkeiten versucht die mir das Intenet geboten hat.... bisher zeigt er mir nur Datensätze an, die mit der Ortskoordinate zu 90% übereinstimmt!

    Folgende Codes habe ich versucht:

    SQL-Abfrage

    1. SELECT * WHERE `lat` LIKE '" & Lattb.Text & "%' OR `lon` LIKE '" & lontb.Text & "%' ORDER BY `lat`, `lon`


    SQL-Abfrage

    1. SELECT * WHERE `lat` LIKE '" & Lattb.Text & "%' AND `lon` LIKE '" & lontb.Text & "%' ORDER BY `lat`, `lon`

    Dieses kam mir bisher am logischsten vor, nur leider Sortiert er ja nur auf oder absteigend den Inhalt der Daten und nicht der zu vergleichenden Koordinate

    SQL-Abfrage

    1. SELECT * Order BY `lat`, `lon`



    In Textbox1 53.6330243 in Textbox2 10.00053627

    Nun soll der den Dichtesten Datensatz nach oben setzten und dann absteigend sortieren.



    Ich hoffe Ihr versteht es und könnt mir helfen

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    ich wüsste nicht, dass das in sql ginge.
    Der Abstand eines gegebenen Punktes zu deinen Datensätzen muss ja für jeden Datensatz neu berechnet werden.
    ORDER BY akzeptiert aber nur einen SpaltenNamen, und deine Spalten geben die gewünschte Information halt nicht her.

    Viel einfacher wäre es, wenn die Daten schon im Client sind, und du mit vb.net-Code drauflosgehen könntest.
    oder evtl. eine Pseudospalte, die einen errechneten Wert enthält, nach dem du sortierst.

    Somit sollte der "nähste" Datensatz oben stehen, wenn du diesen Ausdruck ASC sortierst.

    am nähsten an Punkt 10/10

    SQL-Abfrage

    1. ​SELECT *, (ABS(lat-10)+ABS(long-10)) as val FROM myNiceTable ORDER BY val ASC;



    LG, Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Man kann natürlich das direkt tun mit MySQL Abfragen oder du löst es innerhalb des Programms indem du dir alle Werte zurück geben lässt und dann mit einer Schleife ordentlich durchgehst und danach suchen lässt (For Each / For / Do Loop u.s.w). In einem externen Thread wäre das sogar noch besser - verhindert das die Hauptform für den User einfriert.

    Als Plan B ^^
    "Es gibt guten und schlechten Code und es gibt Code der einfach nur Funktionieren soll." - P. White


    www.pacrafts.de
    MySQL unterstützt den Spatial Datentyp POINT. (ab 5.7)
    Das ist eine Spalte und du hast Funktionen wie Distance usw.

    dev.mysql.com/doc/refman/5.7/e…nction_st-distance-sphere

    SQL-Abfrage

    1. SELECT c.*,
    2. st_distance_sphere(point(@lat, @lng), point(lat, lng)) as dist
    3. FROM table
    4. ORDER BY dist
    Das ist meine Signatur und sie wird wunderbar sein!
    @Acr0most

    die Idee ist klasse, nur leider sind die Ergebnisse kaum verwendbar es sei denn es sind die selben Koordinaten!
    damnach könnte ich zu oft ein Ergebnis von Bsp. null bekommen

    aber fürs erste lasse ich den Code erstmal stehen, da es ein grober Überblick ist =)

    danke


    @Mono

    ich werde es gleich mal versuchen.
    habe mich in dem Artikel eingelesen, aber leider nicht mal die Hälfte verstanden =\

    UPDATE________

    Leider bekomme ich eine Fehlermeldung : FUNCTION loglst.st_distance_sphere does not exist

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „PhilippHH“ ()

    Inwiefern kann das null werden?
    Sind deine Daten dann schlecht gepflegt?

    Wieso nur wenn es "die selben" Koordinaten sind?

    LG, Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    @Acr0most

    Ich habe zum Beispiel einen Datensatz in der Tabelle "ressourcen" lat = 53.6330243 und lon= 10.0053627. Diese Koordinaten werden in einem Formular in eine Textbox übergeben lattb und lontb (Koordinaten Flughafen Hamburg).

    Nun habe ich in dem Adress-Datensatz die Koordinaten lat= 53.6330243 und lon= 10.0053627.
    Nach dem Code

    SQL-Abfrage

    1. SELECT * (ABS(`lat`-'" & lattb.Text & "')+ABS(`lon`-'" & lontb.Text & "')) as Distanz FROM ressourcen ORDER BY Distanz "


    Kommt nun in der Abfrage bei Distanz 0 raus. Ist rechnerisch richtig, da ja beide Koordinaten die Selben sind!

    @Toorms
    hier die Versionsangaben:

    Datenbank-Server
    Server: 127.0.0.1 via TCP/IP
    Server-Typ: MariaDB
    Server-Verbindung: SSL wird nicht verwendet
    Server-Version: 10.1.33-MariaDB - mariadb.org binary distribution
    Protokoll-Version: 10
    Benutzer: root@localhost
    Server-Zeichensatz: UTF-8 Unicode (utf8)

    Webserver
    Apache/2.4.33 (Win32) OpenSSL/1.1.0h PHP/7.2.6
    Datenbank-Client Version: libmysql - mysqlnd 5.0.12-dev - 20150407 - $Id: 38fea24f2847fa7519001be390c98ae0acafe387 $
    PHP-Erweiterung: mysqli curl mbstring
    PHP-Version: 7.2.6

    PhilippHH schrieb:

    Kommt nun in der Abfrage bei Distanz 0 raus.

    Soll ja so sein. Und bei allen Coordinaten, bei denen Abweichungen sind, kommt ein Wert > 0.
    In Post #6 redest du von "kaum verwertbar", weil "null" rauskommt und nur bei gleichen Koords ein Ergebnis.

    Kann m.M.n. nicht sein, es sei denn du hast in deiner DB die Coordinaten als irgendwas anderes als Float/Double oder deine Daten nicht richtig gepflegt sind und "null - 50.12345" einfach nicht geht.


    LG, Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup: