Comment concaténer des ensembles de résultats entiers dans MySQL ?

J'essaie la requête suivante :

SELECT A,B,C FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY B ASC LIMIT 5

C'est trois requêtes collées ensemble, en quelque sorte. Cependant, le jeu de résultats qui revient reflète les résultats de la requête

请先 登录 后评论

5 réponses

Mark Harrison

Pouvez-vous le faire en tant que sous-sélection, quelque chose comme

select * from (
    SELECT A,B,C FROM table WHERE field LIKE 'query%'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query%'
) ORDER BY B ASC LIMIT 5
请先 登录 后评论
Greg Hurlman

S'il n'y a pas de tri logique pour les ordonner, n'unissez pas les résultats ensemble - renvoyez simplement 3 jeux d'enregistrements distincts et traitez-les en conséquence dans votre niveau de données.

请先 登录 后评论
Yaakov Ellis

Ajoutez une colonne supplémentaire avec des valeurs codées en dur que vous utiliserez pour trier l'ensemble de résultats global, comme ceci :

SELECT A,B,C,1 as [order] FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C,2 as [order] FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C,3 as [order] FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY [order] ASC, B ASC LIMIT 5
请先 登录 后评论
svrist

SELECT distinct a,b,c FROM ( SELECT A,B,C,1 as o FROM table WHERE champ LIKE 'query%' SYNDICAT SELECT A,B,C,2 as o FROM table WHERE champ LIKE '%query' SYNDICAT SELECT A,B,C,3 as o FROM table WHERE champ LIKE '%query%' ) ORDRE PAR o ASC LIMITE 5

Ce serait ma façon de faire. Je ne sais pas comment cela évolue.

Je ne comprends pas

GROUP BY B ORDER BY B ASC LIMIT 5

S'applique-t-il uniquement au dernier SELECT de l'union ?

Mysql vous permet-il réellement de regrouper par colonne et de ne toujours pas faire d'agrégats sur les autres colonnes ?

EDIT : aaahh. Je vois que mysql le fait réellement. C'est une version spéciale de DISTINCT(b) ou quelque chose comme ça. Je ne voudrais pas essayer d'être un expert dans ce domaine :)

请先 登录 后评论
Community

Il existe deux variantes d'UNION.

'UNION' and 'UNION ALL'

Dans la plupart des cas, ce que vous voulez vraiment dire, c'est UNION ALL car cela ne fait pas l'élimination des doublons (pensez SELECT DISTINCT) entre les ensembles, ce qui peut entraîner des économies importantes en termes de temps d'exécution.

D'autres ont suggéré plusieurs ensembles de résultats, ce qui est une solution viable, mais je mettrais en garde contre cela dans les applications sensibles au temps ou les applications connectées sur des WAN, car cela peut entraîner beaucoup plus d'allers-retours sur le câble entre le serveur et le client.

请先 登录 后评论