2010-08-20 9 views
85

Ich möchte Reihenfolge mit mit Union in MySQL-Abfrage verwenden. Ich erhalte verschiedene Arten von Datensatz basierend auf verschiedenen Kriterien aus einer Tabelle basierend auf der Entfernung für eine Suche auf meiner Website. Die erste ausgewählte Abfrage gibt Daten zurück, die sich auf die genaue Ortssuche beziehen. Die zweite Auswahlabfrage gibt Daten in Bezug auf die Entfernung innerhalb von 5 km von dem gesuchten Ort zurück. Die dritte Auswahlabfrage gibt Daten zurück, die sich auf die Entfernung innerhalb von 5-15 km von dem gesuchten Ort beziehen.Verwendung von Union und Order by-Klausel in Mysql

Dann verwende ich Union, um alle Ergebnisse zusammenzuführen und auf einer Seite mit Paging anzuzeigen. Unter geeigneter Position wie ‚Exact Suchergebnisse‘, ‚Ergebnisse im Umkreis von 5 km‘ etc

Jetzt mag ich Ergebnisse sortieren basierend auf ID oder add_date. Aber wenn ich Order-by-Klausel am Ende meiner Abfrage hinzufügen (Abfrage Union Union Abfrage 2 Union Reihenfolge von Add_date). Es sortiert alle Ergebnisse. Aber was ich will, ist es sollte unter jeder Überschrift sortieren.

+0

Welcher (n) Typ (en) ist/sind die Felder, nach denen Sie in jeder Tabelle sortieren möchten? – user151841

Antwort

163

Sie können dies tun, indem Sie einen Pseudo-Spalte namens Rang zu jedem Hinzufügen wählen, dass Sie zuerst sortieren können, bevor das von anderen Kriterien sortieren, zB:

select * 
from (
    select 1 as Rank, id, add_date from Table 
    union all 
    select 2 as Rank, id, add_date from Table where distance < 5 
    union all 
    select 3 as Rank, id, add_date from Table where distance between 5 and 15 
) a 
order by rank, id, add_date desc 
+0

Hallo, danke dafür, ich benutze genau diesen Weg. Aber was ich will ist, dass ich Abfrageergebnis basierend auf add_date in absteigender Reihenfolge sortieren möchte. – Aditya

+0

Sie können dafür das Schlüsselwort 'desc' verwenden. Ich habe die obige Abfrage aktualisiert. – RedFilter

+0

Ich habe gerade eine schnelle Änderung der Codes vorgenommen, und die Ergebnisse waren großartig. Du hast meinen Tag gerettet. Danke – Aditya

0

Versuchen:

SELECT result.* 
FROM (
[QUERY 1] 
UNION 
[QUERY 2] 
) result 
ORDER BY result.id 

Wo [QUERY 1] und [QUERY 2] sind Ihre zwei Abfragen, die Sie zusammenführen möchten.

0

Dies liegt daran, Sie sind gesamte Ergebnismengen-Sortierung, sollten Sie jeden Teil der Vereinigung separat sortieren, oder Sie können ORDER BY verwenden (etwas dh. Subquery Entfernung) THEN (etwas dh Zeile id) Klausel

4

eine Abfrage Vereinigung kann nur ein Master ORDER BY Klausel , IIRC. Um dies zu erhalten, fügen Sie in jeder Abfrage, die die größere UNION Abfrage bildet, ein Feld hinzu, das das Feld sein wird, nach dem Sie nach UNION 's ORDER BY sortieren.

Zum Beispiel könnten Sie so etwas wie

SELECT field1, field2, '1' AS union_sort 
UNION SELECT field1, field2, '2' AS union_sort 
UNION SELECT field1, field2, '3' AS union_sort 
ORDER BY union_sort 

That union_sort Feld alles sein können Sie sortieren möchten. In diesem Beispiel passiert es nur Ergebnisse aus der ersten Tabelle setzen ersten, zweite Tabelle zweiten usw.

38

Sie Subqueries, dies zu tun verwenden können:

select * from (select values1 from table1 order by orderby1) as a 
union all 
select * from (select values2 from table2 order by orderby2) as b 
+1

Tnx, Gut zu trennen Bestellungen. Wir können auch eine andere Anordnung haben, wenn die Bestellklausel üblich ist, aber wir wollen, dass die Ergebnisse getrennt werden (anstatt Aufträge zu trennen): SELECT * FROM ( SELECT aaa AS Col, 1 AS Offizielle VON table1 UNION ALL SELECT bbb AS Col, 0 AS Offizielle von table2 ) AS tbl ORDER BY Offizielle, Col' – Alix

+6

Dies ist [falsch] (http://dev.mysql.com/doc/refman/5.7/en/union.html): * Die Verwendung von 'ORDER BY' für einzelne' SELECT'-Anweisungen impliziert nichts über die Reihenfolge, in der die Zeilen im Endergebnis erscheinen * – shmosel

+0

Sie haben Recht, die angenommene Antwort ist auch die richtige. Das hat einfach gut funktioniert, als ich es getestet habe. – rickythefox

0

ich Zugabe versucht, die Bestellung von jedem der die Abfragen vor dem Gewerkschaft wie

(select * from table where distance=0 order by add_date) 
union 
(select * from table where distance>0 and distance<=5 order by add_date) 

aber es schien nicht zu funktionieren. Es hat nicht wirklich die Reihenfolge innerhalb der Zeilen von jeder Auswahl getroffen.

Ich denke, Sie werden den Auftrag, indem Sie auf der Außenseite halten müssen und fügen Sie die Spalten in der where-Klausel in der Reihenfolge durch, so etwas wie

(select * from table where distance=0) 
union 
(select * from table where distance>0 and distance<=5) 
order by distance, add_date 

Dies kann ein wenig schwierig sein, da Sie wollen Gruppe für Reihe, aber ich denke, es sollte machbar sein.

+0

user151841 union_sort Idee wäre eine nette Möglichkeit, um die Gruppierung zu behandeln –

2

Ich habe dies funktioniert auf einem Beitritt plus Union.

(SELECT 
    table1.column1, 
    table1.column2, 
    foo1.column4 
FROM table1, table2, foo1, table5 
WHERE table5.somerecord = table1.column1 
ORDER BY table1.column1 ASC, table1.column2 DESC 
) 

UNION 

(SELECT 
    ... Another complex query as above 
) 

ORDER BY column1 DESC, column2 ASC 
23
(select add_date,col2 from table_name) 
    union 
(select add_date,col2 from table_name) 
    union 
(select add_date,col2 from table_name) 

order by add_date 
+0

Dies funktionierte, aber seltsamerweise musste ich eine Sache ändern: Ich musste einen geteilten Alias ​​dem Feld geben, das durch bestellt wurde. Arbeitete außerdem, danke! – HoldOffHunger

6

Vergessen Sie nicht, verbinden alle ist eine Möglichkeit, Datensätze zu einem Datensatz ohne Sortierung oder Zusammenlegung (im Gegensatz zur Union) hinzuzufügen.

So zum Beispiel:

select * from (
    select col1, col2 
    from table a 
    <....> 
    order by col3 
    limit by 200 
) a 
union all 
select * from (
    select cola, colb 
    from table b 
    <....> 
    order by colb 
    limit by 300 
) b 

Es hält die einzelnen Abfragen klarer und ermöglicht es Ihnen, durch verschiedene Parameter in jeder Abfrage zu sortieren. Wenn Sie jedoch die gewählte Antwort verwenden, kann dies je nach Komplexität und Abhängigkeit der Daten klarer werden, da Sie die Sortierung konzeptualisieren. Außerdem können Sie die künstliche Spalte an das Abfrageprogramm zurückgeben, so dass sie einen Kontext hat, nach dem sie sortieren oder organisieren kann.

Aber dieser Weg hat den Vorteil, schnell zu sein, keine zusätzlichen Variablen einzuführen und es einfach zu machen, jede Abfrage einschließlich der Sortierung zu trennen. Die Möglichkeit, ein Limit hinzuzufügen, ist einfach ein zusätzlicher Bonus.

Und natürlich zögern Sie nicht, die Union alle in eine Union und fügen Sie eine Sortierung für die gesamte Abfrage. Oder fügen Sie eine künstliche ID hinzu. In diesem Fall ist es auf diese Weise einfach, nach verschiedenen Parametern in jeder Abfrage zu sortieren, aber ansonsten entspricht dies der akzeptierten Antwort.