Question

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

Cela fait 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 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 tous pour la requête n°3 ?Je ne veux pas encore faire cela en PHP (sans parler de devoir contrôler les résultats qui sont apparus dans la première requête pour ne pas s'afficher dans la seconde et ainsi de suite).

Était-ce utile?

La solution

Vous devriez peut-être essayer d'inclure une quatrième colonne, en indiquant le tableau d'où elle provient, puis la trier et la regrouper :

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

Autres conseils

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

Pouvez-vous le faire en 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

SELECT distinct a,b,c FROM ( SELECT A,B,C,1 as o FROM table WHERE champ LIKE 'query%' UNION EUROPÉENNE SELECT A,B,C,2 as o FROM table WHERE champ LIKE '%query' UNION EUROPÉENNE SELECT A,B,C,3 as o FROM table WHERE champ LIKE '%query%' ) CLASSER PAR o NCP LIMITE 5

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

je ne comprends pas le

GROUP BY B ORDER BY B ASC LIMIT 5

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

MySQL vous permet-il réellement de regrouper par colonne sans toutefois effectuer d'agrégations sur les autres colonnes ?

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

S'il n'existe pas de tri logique pour les classer comme vous le souhaitez, 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.

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 fournit 5 résultats au total, trie à partir de la quatrième « colonne » et me donne ce dont j'ai besoin ;un ensemble de résultats naturels (il arrive via AJAX) et un ensemble de résultats génériques suivant juste après.

:)

/mp

Il existe deux variantes d'UNION.

'UNION' and 'UNION ALL'

Dans la plupart des cas, ce que vous voulez vraiment dire est UNION ALL car il n'effectue pas d'élimination en double (pensez SELECT DISTINCT) entre les ensembles, ce qui peut entraîner des économies considérables en termes de temps d'exécution.

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

Je ne comprends pas pourquoi le syndicat a besoin de 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top