Je veux utiliser order by with union dans la requête mysql. Je récupère différents types d'enregistrement en fonction de différents critères dans une table basée sur la distance pour une recherche sur mon site. La première requête de sélection renvoie des données liées à la recherche de lieu exacte. La deuxième requête de sélection renvoie des données relatives à la distance à moins de 5 km du lieu recherché. La troisième requête de sélection renvoie des données relatives à la distance dans un rayon de 5 à 15 km du lieu recherché.
Ensuite, j'utilise l'union pour fusionner tous les résultats et les afficher sur une page avec pagination. Sous la rubrique appropriée comme «Résultats de recherche exacts» , «Résultats dans un rayon de 5 km», etc.
Maintenant, je veux trier les résultats en fonction de l'identifiant ou de la date d'ajout. Mais quand j'ajoute ordre par clause à la fin de ma requête (query1 union query 2 union query 3 order by add_date). Il trie tous les résultats. Mais ce que je veux, c'est qu'il devrait trier sous chaque rubrique.
la source
Réponses:
Vous pouvez le faire en ajoutant une pseudo-colonne nommée rank à chaque sélection, que vous pouvez trier d'abord, avant de trier selon vos autres critères, par exemple:
la source
a
et la fin?order by
? ( "pour trier ou limiter leUNION
résultat entier ,SELECT
mettez entre parenthèses les instructions individuelles et placez leORDER BY
ouLIMIT
après le dernier" ). Comparez votre code avec i.stack.imgur.com/LpTMU.pngVous pouvez utiliser des sous-requêtes pour ce faire:
la source
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
pour desSELECT
déclarations individuelles n'implique rien sur l'ordre dans lequel les lignes apparaissent dans le résultat finalla source
Une requête Union ne peut avoir qu'une seule
ORDER BY
clause maîtresse , IIRC. Pour obtenir cela, dans chaque requête constituant laUNION
requête la plus importante , ajoutez un champ qui sera celui que vous triez pour lesUNION
'sORDER BY
.Par exemple, vous pourriez avoir quelque chose comme
Ce
union_sort
champ peut être tout ce que vous souhaitez trier. Dans cet exemple, il arrive juste de placer les résultats de la première table en premier, de la deuxième table en second, etc.la source
N'oubliez pas, union all est un moyen d'ajouter des enregistrements à un jeu d'enregistrements sans trier ni fusionner (par opposition à l'union).
Donc par exemple:
Il maintient les requêtes individuelles plus claires et vous permet de trier par différents paramètres dans chaque requête. Cependant, en utilisant la manière de la réponse sélectionnée, cela peut devenir plus clair en fonction de la complexité et de la relation entre les données, car vous conceptualisez le tri. Il vous permet également de renvoyer la colonne artificielle au programme d'interrogation afin qu'elle dispose d'un contexte dans lequel il peut trier ou organiser.
Mais cette méthode a l'avantage d'être rapide, de ne pas introduire de variables supplémentaires et de faciliter la séparation de chaque requête, y compris le tri. La possibilité d'ajouter une limite est simplement un bonus supplémentaire.
Et bien sûr, n'hésitez pas à transformer le syndicat en une union et à ajouter un tri pour l'ensemble de la requête. Ou ajoutez un identifiant artificiel, auquel cas cette méthode permet de trier facilement selon différents paramètres dans chaque requête, mais sinon, c'est la même chose que la réponse acceptée.
la source
J'ai fait travailler cela sur une union plus syndicale.
la source
Lorsque vous utilisez une
ORDER BY
clause à l'intérieur d'une sous-requête utilisée en conjonction avec unUNION
mysql, laORDER BY
clause sera optimisée .En effet, par défaut, a
UNION
renvoie une liste non ordonnée, donc anORDER BY
ne ferait rien.L'optimisation est mentionnée dans la documentation et dit:
La dernière phrase est un peu trompeuse car elle devrait avoir un effet. Cette optimisation pose un problème lorsque vous vous trouvez dans une situation où vous devez commander dans la sous-requête.
Pour forcer MySQL à ne pas faire cette optimisation, vous pouvez ajouter une clause LIMIT comme ceci:
Un high
LIMIT
signifie que vous pouvez ajouter unOFFSET
sur la requête globale si vous voulez faire quelque chose comme la pagination.Cela vous donne également l'avantage supplémentaire de pouvoir
ORDER BY
utiliser différentes colonnes pour chaque union.la source
Essayer:
Où [QUERY 1] et [QUERY 2] sont vos deux requêtes que vous souhaitez fusionner.
la source
C'est parce que vous triez le jeu de résultats entier, vous devez trier, chaque partie de l'union séparément, ou vous pouvez utiliser ORDER BY (Quelque chose c'est-à-dire. Distance de sous-requête) THEN (quelque chose comme id de ligne) clause
la source
J'ai essayé d'ajouter l'ordre par à chacune des requêtes avant l'union comme
mais cela ne semblait pas fonctionner. Il n'a pas fait le classement dans les lignes de chaque sélection.
Je pense que vous devrez garder l'ordre à l'extérieur et ajouter les colonnes de la clause where à l'ordre par, quelque chose comme
Cela peut être un peu délicat, car vous souhaitez regrouper par plages, mais je pense que cela devrait être faisable.
la source