Ich möchte order by with union in der MySQL-Abfrage verwenden. Ich rufe verschiedene Arten von Datensätzen basierend auf verschiedenen Kriterien aus einer Tabelle basierend auf der Entfernung für eine Suche auf meiner Website ab. Die erste Auswahlabfrage gibt Daten zurück, die sich auf die genaue Ortssuche beziehen. Die zweite Auswahlabfrage gibt Daten zurück, die sich auf die Entfernung innerhalb von 5 km vom gesuchten Ort beziehen. Die dritte Auswahlabfrage gibt Daten zurück, die sich auf die Entfernung innerhalb von 5 bis 15 km vom gesuchten Ort beziehen.
Dann verwende ich Union, um alle Ergebnisse zusammenzuführen und auf einer Seite mit Paging anzuzeigen. Unter der entsprechenden Überschrift "Genaue Suchergebnisse" , "Ergebnisse innerhalb von 5 km" usw.
Jetzt möchte ich die Ergebnisse nach id oder add_date sortieren. Aber wenn ich am Ende meiner Abfrage order by-Klausel hinzufüge (query1 union query 2 union query 3 order by add_date). Es sortiert alle Ergebnisse. Aber was ich will ist, dass es unter jeder Überschrift sortieren sollte.
quelle
Antworten:
Sie können dies tun, indem Sie jeder Auswahl eine Pseudospalte mit dem Namen rank hinzufügen, nach der Sie zuerst sortieren können, bevor Sie nach Ihren anderen Kriterien sortieren, z.
quelle
a
und das Ende?order by
ausführen können? ( "Um das gesamteUNION
Ergebnis zu sortieren oder einzuschränken , setzen Sie die einzelnenSELECT
Anweisungen in Klammern und setzen Sie dasORDER BY
oderLIMIT
nach dem letzten" ). Vergleichen Sie Ihren Code mit i.stack.imgur.com/LpTMU.pngSie können dazu Unterabfragen verwenden:
quelle
SELECT * FROM ( SELECT aaa AS Col, 1 AS Official FROM table1 UNION ALL SELECT bbb AS Col, 0 AS Official FROM table2 ) AS tbl ORDER BY Official, Col
ORDER BY
für einzelneSELECT
Anweisungen impliziert nichts über die Reihenfolge, in der die Zeilen im Endergebnis erscheinenquelle
Eine Union-Abfrage kann nur eine Master-
ORDER BY
Klausel haben, IIRC. Um dies zu erhaltenUNION
, fügen Sie in jeder Abfrage, aus der die größere Abfrage besteht, ein Feld hinzu, nach dem Sie für dieUNION
's sortierenORDER BY
.Zum Beispiel könnten Sie so etwas haben
Dieses
union_sort
Feld kann alles sein, nach dem Sie sortieren möchten. In diesem Beispiel werden nur die Ergebnisse der ersten Tabelle an erster Stelle, der zweiten Tabelle an zweiter Stelle usw. gesetzt.quelle
Vergessen Sie nicht, dass union all eine Möglichkeit ist, Datensätze zu einem Datensatz hinzuzufügen, ohne sie zu sortieren oder zusammenzuführen (im Gegensatz zu union).
Also zum Beispiel:
Dadurch werden die einzelnen Abfragen übersichtlicher und Sie können in jeder Abfrage nach verschiedenen Parametern sortieren. Wenn Sie jedoch die Art der ausgewählten Antwort verwenden, wird dies je nach Komplexität und Beziehung zwischen den Daten möglicherweise klarer, da Sie die Sortierung konzipieren. Außerdem können Sie die künstliche Spalte an das Abfrageprogramm zurückgeben, damit sie einen Kontext hat, nach dem sie sortieren oder organisieren kann.
Diese Methode hat jedoch den Vorteil, dass sie schnell ist, keine zusätzlichen Variablen einführt und es einfach macht, jede Abfrage einschließlich der Sortierung zu trennen. Die Möglichkeit, ein Limit hinzuzufügen, ist einfach ein zusätzlicher Bonus.
Und natürlich können Sie die Union in eine Union verwandeln und eine Sortierung für die gesamte Abfrage hinzufügen. Oder fügen Sie eine künstliche ID hinzu. In diesem Fall ist es auf diese Weise einfach, in jeder Abfrage nach verschiedenen Parametern zu sortieren. Andernfalls entspricht sie der akzeptierten Antwort.
quelle
Ich habe das an einer Join Plus Union arbeiten lassen.
quelle
Wenn Sie eine
ORDER BY
Klausel in einer Unterabfrage verwenden, die in Verbindung mit einerUNION
MySQL verwendet wird, wird dieORDER BY
Klausel optimiert .Dies liegt daran, dass a standardmäßig eine
UNION
ungeordnete Liste zurückgibt, sodass aORDER BY
nichts tun würde.Die Optimierung wird in den Dokumenten erwähnt und sagt:
Der letzte Satz ist etwas irreführend, weil er eine Wirkung haben sollte. Diese Optimierung verursacht ein Problem, wenn Sie sich in einer Situation befinden, in der Sie innerhalb der Unterabfrage bestellen müssen.
Um MySQL zu zwingen, diese Optimierung nicht durchzuführen, können Sie eine LIMIT-Klausel wie folgt hinzufügen:
Ein High
LIMIT
bedeutet, dass SieOFFSET
der Gesamtabfrage eine hinzufügen können, wenn Sie beispielsweise eine Paginierung durchführen möchten.Dies gibt Ihnen auch den zusätzlichen Vorteil, dass Sie
ORDER BY
für jede Union unterschiedliche Spalten verwenden können.quelle
Versuchen:
Wobei [ABFRAGE 1] und [ABFRAGE 2] Ihre beiden Abfragen sind, die Sie zusammenführen möchten.
quelle
Dies liegt daran, dass Sie die gesamte Ergebnismenge sortieren, jeden Teil der Vereinigung separat sortieren sollten oder die Klausel ORDER BY (etwas, dh Unterabfragedistanz) THEN (etwas, dh Zeilen-ID) verwenden können
quelle
Ich habe versucht, die Reihenfolge nach zu jeder der Abfragen hinzuzufügen, bevor ich wie gewerkschaftlich organisiert wurde
aber es schien nicht zu funktionieren. Die Reihenfolge innerhalb der Zeilen aus jeder Auswahl wurde nicht ausgeführt.
Ich denke, Sie müssen die Reihenfolge von außen beibehalten und die Spalten in der where-Klausel zur Bestellung von hinzufügen, so etwas wie
Dies mag etwas schwierig sein, da Sie nach Bereichen gruppieren möchten, aber ich denke, es sollte machbar sein.
quelle