1. Herzlich willkommen bei WPDE.org, dem grössten und ältesten deutschsprachigen Community-Forum rund um das Thema WordPress. Du musst angemeldet oder registriert sein, um Beiträge verfassen zu können.
    Information ausblenden

Loop orderby Ergebnis einer Funktionsberechnung

Dieses Thema im Forum "Plugins und Widgets" wurde erstellt von Uwe_B, 18. November 2015.

  1. Uwe_B

    Uwe_B Well-Known Member

    Registriert seit:
    18. April 2010
    Beiträge:
    70
    Zustimmungen:
    0
    Hallo zusammen,
    ich habe ein relativ anspruchsvolles Problem, wie ich glaube. Ich habe meine Posts um Latitude- und Longitude-Koordinaten erweitert, diese werden in der Datenbank gespeichert. Nun nutze ich folgende Funtkion (herzlichen Dank an Tobias Leuschner), um die Distanz gegebener Koordinaten zum entsprechenden Post zu berechnen:

    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Das funktioniert alles soweit auch ganz gut, alle Posts werden mit Distanz-Angabe in km angezeigt.

    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Jetzt würde ich gerne alle Posts in der Reihenfolge der Distanz ausgeben.

    Ich denke mal dafür müsste ich den Loop erst einmal durchlaufen lassen, um die Distanz zu ermitteln und ein zweites Mal, um die Distanz irgendwie als orderby Variable nutzen zu können - falls das überhaupt geht. Oder sieht jemand noch eine andere, einfache Möglichkeit? Ich bin für alle Hinweise dankbar.

    Grüße,
    Uwe
     
  2. Trunk

    Trunk Well-Known Member

    Registriert seit:
    29. Oktober 2015
    Beiträge:
    104
    Zustimmungen:
    0
    So gesehen schon richtig, da the_loop jeden Post einzeln ausgibt (bzw. dessen Daten).
    Daher wäre es schlauer, ein eigenes SQL-Query zu schreiben, was nur Post-ID, Latitude und Longitude wiedergibt, damit die Daten in PHP schnell eingelesen werden können.
    Allerdings muss dann jedes mal die Entfernung zu jedem anderen Beitrag berechnet werden - was bei vielen Seitenaufrufen auch entsprechende Last verursachen könnte.

    Man kann auch die Posts nach Latitude/Longitude sortiert von MySQL wiedergeben lassen, nach der ID des aktuellen Postings suchen und dann die Posts filtern, die am wenigsten Differenz von Lat/Long haben.

    Wenn ein Post also 50°0'0'' / 40°0'0'' hat, soll SQL nur Post mit 40° bis 60° / 30° bis 50° ausgeben. Für die paar Posts lohnt es sich dann, die genaue Entfernung zu berechnet, um genau danach sortieren zu können.

    Viel Spaß, das in PHP-Code und MySQL-Queries zu übersetzen :D
     
  3. mensmaximus

    mensmaximus Well-Known Member

    Registriert seit:
    24. Juli 2014
    Beiträge:
    8.857
    Zustimmungen:
    437
    Da die Distanz keine Metainformation des Posts ist und somit erst bei der Ausgabe berechnet werden kann, bleibt nur der Weg mit foreach durch das Resultset / die Query zu laufen, die Entfernung zu berechnen und dem Array hinzuzufügen. Nun kann nach dem Arraykey sortiert werden und die Ausgabe erfolgen. Alternativ könnte man bereits in einem eigenen SQL Query die Entfernung berechnen und anschließend durch das sortierte Resultset loopen.
     
  4. Uwe_B

    Uwe_B Well-Known Member

    Registriert seit:
    18. April 2010
    Beiträge:
    70
    Zustimmungen:
    0
    Das liest sich so, als wäre es so kompliziert wie befürchtet.. wenn ich den Loop mit foreach ausgebe, scheint folgender Filter nicht mehr zu funktionieren, der für die Bestimmung des Radius der Umkreissuche verwendet wird:

    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Gäbe es vielleicht die Möglichkeit die Distanz ebenfalls per Filter für die Sortierung nutzbar zu machen?
     
  5. Uwe_B

    Uwe_B Well-Known Member

    Registriert seit:
    18. April 2010
    Beiträge:
    70
    Zustimmungen:
    0
  6. mensmaximus

    mensmaximus Well-Known Member

    Registriert seit:
    24. Juli 2014
    Beiträge:
    8.857
    Zustimmungen:
    437
    Das entspricht der von mir bereits genannten Möglichkeit das direkt in SQL Query zu erledigen.

    Ich sehe keinen Grund warum das nicht gehen sollte. Dazu muss man eben nur die gesamte Programmierung kennen, also alle Funktionen und wie diese ineinander greifen. Für mich persönlich sprengt das aber den Rahmen der Hilfe im Forum.
     
  7. Trunk

    Trunk Well-Known Member

    Registriert seit:
    29. Oktober 2015
    Beiträge:
    104
    Zustimmungen:
    0
    Du bist dir absolut Sicher, dass du für jeden Seitenaufruf die Entfernung aller angezeigten Artikel zu jedem anderen existierenden Artikel vom MySQL-Server berechnen lassen willst?
    Für mich wäre es da doch eleganter, die Werte einmal zu berechnen und dann in einem Extra-Feld zu speichern, was bei bedarf abgefragt und geparst werden kann. Allerdings müssen dann die Daten immer aktuell gehalten werden, also bei jedem neuen Eintrag der hinzugefügt wird, muss bei jedem Eintrag die Distanz zu diesem Artikel hinzugefügt werden.

    Ungeachtet dessen, wieviel die einzelnen Operationen kosten:
    Im Query kommen 4 Multiplikationen und 12 Funktionsaufrufe (sin,cos usw.), 2 Additionen und 1 Wertabfrage vor.

    Und diese Operationen werden für jedes Element in der Datenbank ausgeführt! Bei 100 Posts in der DB und 5 Angezeigten sind das also 9500 Operationen.

    Wenn man nur Lat/Long vergleicht, müssen genau 2 Wertabfragen für jeden Eintrag in der DB getätigt werden, also 1000 Operationen (100 Einträge 5 angezeigte Artikel).
    Je nachdem wie die Toleranz in den Wertabfragen gewählt ist, kommen mehr oder weniger Eintrage als Ergebnis raus. Daher ist die Gesamtanzahl von Operationen für den Sortiervorgang nicht berechenbar, aber unter 9500 liegt sie auf jeden Fall, wenn die Toleranz nicht alle anderen Posts einbezieht.
     
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden