sql - Comment concaténer des jeux de résultats entiers dans MySQL?

Translate

J'essaye 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

Ce sont trois requêtes collées ensemble, en quelque sorte. Cependant, l'ensemble de résultats qui revient reflète les résultats de la requête n ° 3 avant les résultats de la requête n ° 1, ce qui n'est pas souhaité.

Existe-t-il un moyen de les hiérarchiser afin que les résultats soient tous pour la requête n ° 1, puis tous pour la requête n ° 2 puis tout pour la requête n ° 3? Je ne veux pas encore faire cela en PHP (sans parler du contrôle des résultats apparaissant dans la première requête pour ne pas s'afficher dans la seconde et ainsi de suite).

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Vous devriez peut-être essayer d'inclure une quatrième colonne, en indiquant la table dont elle provient, puis la classer et la grouper:

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
La source
Translate

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

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
La source
Translate

SELECT distinct a, b, c FROM (SELECT A, B, C, 1 as o FROM table WHERE champ LIKE 'query%' UNION SELECT A, B, C, 2 as o FROM table WHERE champ LIKE '% query' UNION SELECT A, B, C, 3 as o FROM table WHERE champ LIKE '% query%') ORDER BY o ASC LIMIT 5

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

Je ne comprends pas le

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 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 :)

La source
Translate

S'il n'y a pas de tri qui a du sens pour les ordonner que vous désirez, ne réunissez pas les résultats - renvoyez simplement 3 jeux d'enregistrements séparés et traitez-les en conséquence dans votre niveau de données.

La source
Translate

J'ai finalement (en regardant toutes les suggestions) arrivé à cette solution, c'est un peu un compromis entre ce dont j'ai besoin 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 donne 5 résultats au total, trie à partir de la quatrième "colonne" et me donne ce dont j'ai besoin; un jeu de résultats naturel (il vient sur AJAX), et un jeu de résultats générique juste après.

:)

/ mp

La source
Bernice Lee
Translate

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 il ne duplique pas l'élimination (pensezSELECT DISTINCT) entre les ensembles, ce qui peut se traduire par des économies considérables 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 mets en garde contre cela dans les applications sensibles au temps ou les applications connectées via des réseaux étendus, car cela peut entraîner beaucoup plus d'allers-retours sur le câble entre le serveur et le client.

La source
Translate

Je ne comprends pas pourquoi le besoin d'union pour prendre les données d'une seule table

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