Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Design Problem bei Sortierung von Datensätzen nach Entfernung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Design Problem bei Sortierung von Datensätzen nach Entfernung

    Hallo,

    ich will eine Umkreissuche für bestimmte Objekte in einer Datenbank machen. Zuerst werden alle Postleitzahlen in dem Umkreis in der Form gespeichert:
    Array (
    POSTLEITZAHL1 => ENTFERNUNG_ZUR_EINGABE1,
    POSTLEITZAHL2 => ENTFERNUNG_ZUR_EINGABE2,
    usw...
    )

    Nun habe ich in einer Datenbank alle Objekte mit Postleitzahl. Wenn ich nun alle Postleitzwahlen mit OR verknüpfe kann ich so auch alle Objekte aus der Datenbank auslesen (LIMIT damit nur die ausgelesen werden, die auf der Seite angezeigt werden):
    SELECT * FROM objekt WHERE plz="01234" OR plz="12345" ... LIMIT 0,10

    Allerdings will ich die Objekte nach Entfernung zum Ziel sortieren. Da es am Ende sehr viele Objekte werden, ist es denk ich aber sehr unperformant, alle auszulesen und dann zu sortieren.

    Hat jemand von euch eine Idee, wie man das besser lösen könnte. Kann man vielleicht in SQL nach bestimmten Postleitzahlen sortieren; in etwa wie: zuerst alle Objekte mit 01234, dann alle mit 12345, dann aller mit 22222 usw...?


  • #2
    HI Young Jedi,
    Ich verstehe dein Problem nicht ganz, aber ich hab es jetzt so verstanden, dass du alles nach der plz in der DB sortieren willst, kann das sein? Wenn ja, dan dürfte folgendes nützlich sein:
    Code:
    SELECT * FROM objekt WHERE plz="01234" OR plz="12345" ORDER BY `plz` LIMIT 0,10
    kann das sein??? Falls nicht beschreibe dein Problem bitte nochmal etwas genauer

    lg
    Lollix
    Privatsphäre war gestern, denn:
    Bundestrojaner 2.0: Die neue Version ist da.

    Kommentar


    • #3
      Hi,

      ich gebe zu, dass ich mich oben etwas konfus ausgedrückt habe. Mein Problem ist nicht, dass ich nach der PLZ sortieren will, sondern nach der Entfernung zur eingegebenen PLZ. Man kann sich das ganze so vorstellen:
      PLZ (EingabePLZ) und Radius der Umkreissuche werden eingegeben, das System ermittelt alle PLZ in diesem Umkreis. Damit habe ich schon einmal alle Postleitzahlen sortiert nach der Entfernung zur EingabePLZ. Jetzt habe ich aber in der Datenbank logischer Weiße nicht diese Entfernung und wüsste auch nicht, wie ich danach sortieren kann, außer alle Datensätze auszulesen, mit einer foreach-Schleife zu durchlaufen und dem jeweiligen Objekt anhand seiner PLZ die Entfernung zuzuschreiben und das zu sortieren. Das ist aber IMHO sehr ressourcenraubend (falls dem nicht so ist, lass ich mich auch gerne eines besseren belehren ).

      Wenn man die Entfernung direkt im SQL-Statement berechnen könnte, würde das ganze auch gehen. Allerdings wüsste ich nicht, wie das gehen sollte... in PHP berechne ich den ganzen Spaß so:

      PHP-Code:
              $latitude1 $dataPlz1['breite'] * pi() / 180;
              
      $longitude1 $dataPlz1['laenge'] * pi() / 180;
              
      $latitude2 $dataPlz2['breite'] * pi() / 180;
              
      $longitude2 $dataPlz2['laenge'] * pi() / 180;

              
      /*
               *  Entfernung km =
               *      acos(sin(Breitengrad 1) x sin(Breitengrad 2) +  cos(Breitengrad 1) x
               *      cos(Breitengrad 2) x cos(Längengrad 1 - Längengrad 2) ) * Erdradius
               */
              
      $distance acos(sin($latitude1) * sin($latitude2) + cos($latitude1) *
                          
      cos($latitude2) * cos($longitude1 $longitude2)) * 6370;

              return (int) 
      $distance

      Kommentar


      • #4
        Auch MySQL bietet mathematische Funktionen an, die du auch auf Tabellenspalten anwenden kannst: MySQL :: MySQL 5.1 Referenzhandbuch :: 12.4.2 Mathematische Funktionen .

        Das Thema gehört wohl eher in das Forum Datenbanken.
        http://hallophp.de

        Kommentar


        • #5
          Falls jemand das selbe Problem hat, hilft das vielleicht ganz gut:

          Code:
          SELECT 6371 * ACos( Cos(RADIANS(Lat)) * Cos(RADIANS(UserLat)) *  Cos(RADIANS(UserLng) - RADIANS(Lng)) + Sin(RADIANS(Lat)) *  Sin(RADIANS(UserLat)) ) AS Distance 
          FROM ... 
          ORDER BY Distance ASC
          Danke für den Hinweis, Asipak

          Kommentar

          Lädt...
          X