Announcement

Collapse
No announcement yet.

mysql-Abfrage ohne Schleife - Umkreissuche

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • mysql-Abfrage ohne Schleife - Umkreissuche

    Hallo,

    ich möchte für eine Umkreissuche Entfernungen im Voraus in einer Tabelle "umkreise" speichern. Dabei existieren bereits 2 Tabellen -> Tabelle "orte" enthält alle Ortschaften mit Geodaten und Tabelle "sehenswuerdigkeiten" alle Sehenswürdigkeiten mit Geodaten. In der Tabelle "umkreise" sollen für jedem Ort (Feld ort_id ist der eindeutige Index) die 20 nächstgelegenen Sehenswürdigkeiten hinterlegt werden (Feld swd_id ist der eindeutige Index) und dazu die Entfernung in km.

    Zur Zeit nutze ich folgende Abfrage, um für einen Ort die Entfernungen der 20 nächstgelegenen Sehenswürdigkeiten zu erhalten.

    USE geodaten;
    SET @lat1 = 50.756083, @lng1 = 6.105333;
    SELECT sehenswuerdigkeiten.swd_id ,
    ROUND(6378.16 * ACOS(((SIN(@lat1 / 57.2958) * SIN(sehenswuerdigkeiten.lat / 57.2958))
    + ((COS(@lat1 / 57.2958) * COS(sehenswuerdigkeiten.lat / 57.2958))
    * COS((sehenswuerdigkeiten.lng / 57.2958) - (@lng1 / 57.2958))))),2) AS `entf_km`
    FROM sehenswuerdigkeiten
    ORDER BY entf_km asc
    LIMIT 20;

    Dabei werden die Variablen @lat1, @lng1 mit Geodaten von einen entsprechenden Ort befüllt. Das funktioniert auch prima, nur bei vielen gleichzeitigen Anfragen an die Datenbank dauert dies zu lange. So kam die Idee, in einer Tabelle "umkreise" bereits im Vorfeld für jeden Ort alle 20 nächstgelegenen Sehenswürdigkeiten zu hinterlegen. Auch für das Erzeugen der Tabelle "umkreise" gibt es bereits eine Lösung, bei welcher mit java für jeden Ort Ort die Geodaten ermittelt werden, oben aufgeführte Abfrage ausgeführt wird und das Ergebnis dann in Tabelle "umkreise" gespeichert wird.

    Nun zu meinem Anliegen. Mich interessiert, ob die selbe Aufgabe auch ausschließlich in einer mysql-Abfrage (ohne Schleifenkonstrukte) - also ohne Zuhilfenahme einer weiteren Programmiersprache umsetzbar ist. Ich habe schon vieles probiert, doch leider ohne Erfolg. Leider sind meine SQL-Kenntnisse zu gering, um einschätzen zu können, ob eine Abfrage dieser Art simpel realisieren zu können. Wer kann mir hierzu Tipps geben? Geht das überhaupt. Die Abfrage müsste ja zusätzlich zu oben aufgeführter Abfrage alle Städte durchlaufen.

    Gruß vom janti

  • #2
    Warum benutzt du nicht die dafür vorgesehenen Datentypen und Funktionen? Ein Beispiel findest du hier. Das sollte deine Abfrage deutlich einfacher und lesbarer machen.

    Thomas

    Comment


    • #3
      Hallo janti,

      ich stand mal vor einem ähnlichen Problem und habe die Abfrage folgendermaßen optimiert, wenn ich das noch richtig hinbekomme (ist etwas länger her):
      Du hast ja Koordinaten, zwei (lat, lon) für den abzufragenden Ort und zwei jeweils je Sehenswürdigkeit (SW). Wenn Du jetzt in der Abfrage, die quasi die Entfernungen immer aller Sehenswürdigkeiten berechnet, eine WHERE-Abfrage reinnimmst, die lediglich die Sehenswürdigkeiten in max. x km Entfernung berücksichtigt, könnte sie deutlich schneller sein. Ich kenne jetzt Dein Beispiel nicht konkret, aber angenommen, Du hast SWs in ganz Deutschland, es macht aber wenig Sinn, jemandem eine SW anzuzeigen, die 200km weg ist, könntest Du mit der Einschränkung WHERE lat <= @lat + n AND lat >= @lat - n AND lon <= @lon + n AND lon >= @lon - n evtl. die Treffermenge deutlich einschränken, wobei n eben für eine Koordinatendifferenz steht, die dem von Dir festgelegten Umkreis entspricht. Weiß nicht, ob Du dann in jedem Fall noch 20 Treffer zusammenbekommst und ob Du immer 20 bekommen musst, auch wenn sie zum Teil vielleicht nur wenig Sinn machen.

      Bei mir klappte das damals sehr gut und ich brauchte keine vorberechneten Werte mehr ...

      Comment


      • #4
        Hallo,
        Originally posted by Thomas Henkel View Post
        Warum benutzt du nicht die dafür vorgesehenen Datentypen und Funktionen?
        Weil wir hier von MySQL und nicht vom MS-SQL-Server reden ...

        Zum Thema:
        Ja ich weiss, die Erde ist eine Kugel und keine Scheibe, aber ist die exakte Berechnung der Entfernung für deine Zwecke wirklich notwendig? Reicht ggfs. einfache Dreiecksberechnung (Satz des Phytagoras) aus? Wenn es nur um die Sortierung und Ermittlung der nächsten 20 Objekte geht, spielt die Erdkrümmung keine Rolle. Wenn du die Entfernung mit ausgibst, dann solltest du überlegen mit welcher Genauigkeit das geschieht und was dafür sinnvoll ist.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Originally posted by Falk Prüfer View Post
          Weil wir hier von MySQL und nicht vom MS-SQL-Server reden ...
          Ups

          Entschuldigung, das habe ich glatt übersehen.

          Thomas

          Comment

          Working...
          X