Utiliser la clause union et order by dans mysql

Je veux utiliser l’ordre par avec l’union dans la requête mysql. Je vais chercher différents types d’enregistrements en fonction de différents critères dans un tableau basé sur la distance pour une recherche sur mon site. La première requête de sélection renvoie des données relatives à la recherche de lieu exacte. La 2ème requête de sélection renvoie des données relatives à la distance à moins de 5 km de l’endroit recherché. La 3ème requête de sélection renvoie des données relatives à la distance à 5-15 km de l’endroit recherché.

Ensuite, utilisez l’union pour fusionner tous les résultats et afficher sur une page avec pagination. Sous le titre approprié «Résultats de recherche exacts» , «Résultats dans un rayon de 5 km», etc.

Maintenant, je veux sortinger les résultats en fonction de id ou add_date. Mais quand j’ajoute une clause order by à la fin de ma requête (query1 union query 2 union query 3 order by add_date). Il sortinge tous les résultats. Mais ce que je veux, c’est qu’il faut sortinger sous chaque titre.

Vous pouvez le faire en ajoutant une pseudo-colonne nommée rank à chaque sélection, que vous pouvez sortinger en premier, avant de sortinger selon vos autres critères, par exemple:

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 

Vous pouvez utiliser des sous-requêtes pour faire cela:

 select * from (select values1 from table1 order by orderby1) as a union all select * from (select values2 from table2 order by orderby2) as b 
 (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 

N’oubliez pas que l’union est un moyen d’append des enregistrements à un jeu d’enregistrements sans les sortinger ou les fusionner (contrairement à l’union).

Donc par exemple:

 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 

Il garde les requêtes individuelles plus claires et vous permet de sortinger par différents parameters dans chaque requête. Cependant, en utilisant le mode de réponse sélectionné, cela peut devenir plus clair en fonction de la complexité et du lien entre les données car vous conceptualisez le type. Il vous permet également de renvoyer la colonne artificielle au programme d’interrogation afin qu’il ait un contexte qu’il peut sortinger ou organiser.

Mais cette méthode a l’avantage d’être rapide, de ne pas introduire de variables supplémentaires et de séparer facilement chaque requête, y compris le sorting. La possibilité d’append une limite est simplement un bonus supplémentaire.

Et bien sûr, n’hésitez pas à transformer le syndicat en syndicat et à append un type à l’ensemble de la requête. Ou ajoutez un identifiant artificiel, auquel cas cette méthode facilite le sorting par différents parameters dans chaque requête, mais il en va de même pour la réponse acceptée.

Une requête d’union ne peut avoir qu’une seule clause ORDER BY maître, IIRC. Pour obtenir ceci, dans chaque requête constituant la plus grande requête UNION , ajoutez un champ qui sera le seul champ que vous sortingerez pour l ‘ ORDER BY UNION .

Par exemple, vous pourriez avoir quelque chose comme

 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 

Ce champ union_sort peut être tout ce que vous voulez sortinger. Dans cet exemple, il arrive juste de mettre les résultats de la première table en premier, de la deuxième table en second, etc.

J’ai travaillé sur une union join plus.

 (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 

Essayer:

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

Où [QUERY 1] et [QUERY 2] sont vos deux requêtes que vous souhaitez fusionner.

C’est parce que vous sortingez l’ensemble des résultats, vous devez sortinger chaque partie de l’union séparément, ou vous pouvez utiliser ORDER BY (quelque chose, par exemple la distance de la sous-requête) ALORS (quelque chose c.à.d. identifiant de la ligne)

J’ai essayé d’append la commande à chacune des requêtes avant l’union comme

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

mais cela ne semblait pas fonctionner. Il ne faisait pas réellement la commande dans les lignes de chaque sélection.

Je pense que vous devrez garder l'ordre à l'extérieur et append les colonnes dans la clause where à l'ordre par, quelque chose comme

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

Cela peut être un peu délicat, car vous voulez grouper par gammes, mais je pense que cela devrait être faisable.