web-dev-qa-db-fra.com

appliquer "ORDER BY" sur un "UNION" (Mysql)

Bonne journée. Donc, tout est dans le titre :)

Je cherche à fusionner le résultat de deux demandes et à ordonner le résultat ensemble (comme dans pas l'une après l'autre). => Je pensais à appliquer un syndicat et à les commander. Ça n'a pas marché.

J'ai regardé comme ici sur Stack ou ici developpez (!! site web français) . J'essaie les différents exemples et suggestions, mais sans succès. Il me semble que c'est parce que je travaille sur Mysql.

Quoi qu'il en soit, voici mes essais et les résultats:

Mes 2 demandes originales

SELECT * FROM user_relation WHERE from_user_id = 1
List item
SELECT * FROM user_relation WHERE to_user_id = 1

ce résultat d'une liste composée du résultat de la première sélection (odérisé par la clé d'index) suivi du résultat de la deuxième sélection ordonnée par l'index KEy.

Tentative 1:

(SELECT * FROM user_relation WHERE from_user_id = 1 ORDER BY trust_degree)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1 ORDER BY trust_degree)

La requête s'est exécutée, mais le résultat était le même que la requête d'origine: résultat de la première sélection (ordre par clé d'index) suivi des résultats de la deuxième requête

Tentative 2:

(SELECT * FROM user_relation WHERE from_user_id = 1 ORDER BY trust_degree)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1 ORDER BY trust_degree)
ORDER BY trust_degree

=> demande exécutée, résultat comme tentative 1, mais avec un avertissement i la logique Mysql: (ce type de fermeture a déjà été analysé (ORDER BY))

Tentative 3

(SELECT * FROM user_relation WHERE from_user_id = 1
UNION
SELECT * FROM user_relation WHERE to_user_id = 1)
ORDER BY trust_degree

=> Ne s'est pas exécuté, mais une erreur # 1064 - erreur de syntaxe près de UNION

Tentative 4:

SELECT *
FROM (
(SELECT * FROM user_relation WHERE from_user_id = 1)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1)
)
ORDER BY trust_degree 

=> ne fonctionne pas, et une belle liste de 6 erreurs. Toute suggestion?

12
Quiche
SELECT *
FROM (
(SELECT * FROM user_relation WHERE from_user_id = 1)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1)
) AS i
ORDER BY trust_degree

Vous devez attribuer un alias à votre sélection. Mais dans ce cas, un UNION n'est pas nécessaire et pourrait être remplacé par un simple OR, comme le souligne @Karoly Horvath dans son commentaire. La requête résultante ressemblerait à ceci:

SELECT 
 * 
FROM user_relation 
WHERE from_user_id = 1 OR to_user_id = 1 
ORDER BY trust_degree
11
Michael Kunst

Il est écrit dans la documentation de UNION :

Postuler ORDER BY ou LIMIT à un individu SELECT, placez la clause entre parenthèses qui entourent le SELECT:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

...

Utilisation de ORDER BY pour les instructions individuelles SELECT n'implique rien dans l'ordre dans lequel les lignes apparaissent dans le résultat final car UNION produit par défaut un ensemble de lignes non ordonné.

...

Pour utiliser un ORDER BY ou LIMIT clause pour trier ou limiter l'intégralité du résultat UNION, mettre entre parenthèses les instructions SELECT individuelles et placer le ORDER BY ou LIMIT après le dernier. L'exemple suivant utilise les deux clauses:

(SELECT a FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;

Une instruction sans parenthèses équivaut à une parenthèse comme nous venons de le montrer.

En appliquant les informations ci-dessus à votre requête, cela devient:

(SELECT * FROM user_relation WHERE from_user_id = 1)
UNION
(SELECT * FROM user_relation WHERE to_user_id = 1)
ORDER BY trust_degree
5
axiac