2008-08-06 7 views
20

Je suis d'essayer la requête suivante:Comment concaténer des ensembles de résultats entiers dans MySQL?

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, kindasorta. Toutefois, le jeu de résultats qui revient reflète les résultats de la requête # 3 AVANT les résultats de la requête # 1 (indésirable).

Est-il possible d'établir des priorités afin que ces résultats viennent comme tous pour la requête n ° 1, toutes pour la requête n ° 2 puis tout pour la requête n ° 3? Je ne veux pas le faire en PHP pour l'instant (sans parler de devoir contrôler les résultats qui apparaissaient dans la première requête pour ne pas apparaître dans la seconde et ainsi de suite).

Répondre

16

Peut-être que vous devriez essayer, y compris une quatrième colonne, indiquant la table, il est venu, et puis l'ordre et le groupe par celui-ci:

SELECT A,B,C, "query 1" as origin FROM table WHERE field LIKE 'query%' 
UNION 
SELECT A,B,C, "query 2" as origin FROM table WHERE field LIKE '%query' 
UNION 
SELECT A,B,C, "query 3" as origin FROM table WHERE field LIKE '%query%' 
GROUP BY origin, B ORDER BY origin, B ASC LIMIT 5 
3

Pouvez-vous le faire comme subselect, 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 
0

S'il n'y a pas une sorte qui fait sens pour les commander que vous désirez, ne pas l'union des résultats ensemble - juste retour 3 enregistrements séparés , et traitez-les en conséquence dans votre niveau de données.

6

Ajouter une colonne supplémentaire avec des valeurs codées en dur que vous utiliserez pour trier l'ensemble de résultats dans l'ensemble, 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 
0

Je finalement (regarder toutes les suggestions) est venu à cette solution, il est un peu d'un compromis entre ce que je dois et le temps.

SELECT * FROM 
    (SELECT A, B, C, "1" FROM table WHERE B LIKE 'query%' LIMIT 3 
    UNION 
    SELECT A, B, C, "2" FROM table WHERE B LIKE '%query%' LIMIT 5) 
AS RS 
GROUP BY B 
ORDER BY 1 DESC 

il offre 5 résultats au total, sortes de la quatrième « colonne » et me donne ce que je dois; un jeu de résultats naturel (sa venue sur AJAX), et un jeu de résultats génériques suivant juste après.

:)

/mp

1

sélectionner un distinct, b, c à partir de ( SELECT A, B, C, 1 o à partir de la table où le champ LIKE '% de requête' UNION SELECT A , B, C, 2 comme o FROM table WHERE champ LIKE '% query' UNION SELECT A, B, C, 3 comme o FROM table WHERE champ LIKE '% query%' ) COMMANDER PAR o ASC LIMIT 5

Serait ma façon de le faire. Je ne sais pas comment ça va.

Je ne comprends pas le

GROUP BY B ORDER BY B ASC LIMIT 5 

-t-il appliquer uniquement à la dernière SELECT dans l'union?

Est-ce que MySQL vous permet en fait de regrouper par une colonne et toujours pas faire des agrégats sur les autres colonnes?

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

0

Il y a deux varients de UNION.

'UNION' and 'UNION ALL' 

Dans la plupart des cas ce que vous voulez vraiment dire est UNION ALL car il ne fait pas l'élimination des doublons (Pensez SELECT DISTINCT) entre les ensembles qui peuvent entraîner un peu d'économies en termes de temps d'exécution. D'autres ont suggéré plusieurs jeux de résultats, ce qui est une solution réalisable. Cependant, dans les applications sensibles au temps ou les applications connectées sur des réseaux WAN, cela peut entraîner des allers-retours significatifs entre le serveur et le client.

Questions connexes