Ich versuche dies auf Ruby On Rails mit Postgres PostGIS zu tun.
Ich versuche eine Gruppierung zu machen und auf die Stadt der geordneten Liste zu zählen, die ich habe.
Ich habe eine geordnete Liste der nächsten Punkte zu meinen Koordinaten (110.1862202 1.6031959).
Jetzt möchte ich es nach Städten gruppieren und die Anzahl der Objekte in jeder Stadt zählen. Das Format ist jedoch korrekt, aber irgendwie hat es seine Reihenfolge verloren. Ich möchte, dass die Städte meiner Koordinate am nächsten sind. Der springende Punkt ist, die nächste Stadt zu bekommen, aber jetzt ist sie nicht am nächsten geortet.
Abfrage Problemgruppe und zählen Unterabfrage
%Vor%tatsächliches Ergebnis
%Vor%erwartetes Ergebnis
%Vor%Meine Bestellanfrage funktioniert korrekt
%Vor%Ergebnis der Bestellung (das ist richtig)
%Vor%HINWEIS: Mir wurde gesagt, dass Unterabfrage nicht anordnet, wahrscheinlich funktioniert eine äußere Verknüpfung. Wie erstellt man eine solche Abfrage?
Es gibt hier ein paar Dinge, die verhindern, dass Ihre Bestellung funktioniert.
Erstens, wie Sie bereits erwähnt haben, ist jede ORDER
-Klausel in einer Unterabfrage - in der sich Ihre Standortabfrage befindet - für die Reihenfolge der endgültigen Ergebnismenge irrelevant.
Zweitens macht es Ihre GROUP BY city
-Klausel logisch unmöglich, Ihre Ergebnisse eindeutig zu ordnen. Angenommen, Sie haben Schatz A in Stadt X, Entfernung = 10, Schatz B in Stadt Y, Entfernung = 15 und Schatz C in Stadt X, Entfernung = 20. Würde Stadt X in Ihren Ergebnissen zuerst oder zuletzt kommen?
Ich denke jedoch, dass es vernünftig ist anzunehmen, dass alle Städte Schätze in ungefähr einem ähnlichen Gebiet enthalten werden, so dass es vernünftig ist, nach dem nächsten Schatz zu sortieren. Also können wir mit diesem Problem umgehen.
Schließlich gibt Rails group().count
aktuell einen Hashwert für counts aus. Diese API ist wahrscheinlich ziemlich neu und wird sich wahrscheinlich ändern (Hashes sollten meiner Meinung nach nicht bestellt werden, und das Format ist nicht sehr erweiterbar). Sich darauf zu verlassen, könnte eine schlechte Idee sein. Aber nach meinen Tests gibt Ergebnisse in der angeforderten Reihenfolge aus.
Kurz gesagt, müssen wir das order
auf die oberste Ebene Ihrer Abfrage verschieben. Um dies zu tun, muss die Bestellklausel eine Aggregatfunktion verwenden (ich nehme MIN, um nach dem nächsten Schatz zu sortieren), und wir können den ausgefallenen .from
code fallen lassen:
Tags und Links sql ruby-on-rails postgresql group-by