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?
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
Il est écrit dans la documentation de UNION
:
Postuler
ORDER BY
ouLIMIT
à un individuSELECT
, placez la clause entre parenthèses qui entourent leSELECT
:(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 individuellesSELECT
n'implique rien dans l'ordre dans lequel les lignes apparaissent dans le résultat final carUNION
produit par défaut un ensemble de lignes non ordonné....
Pour utiliser un
ORDER BY
ouLIMIT
clause pour trier ou limiter l'intégralité du résultatUNION
, mettre entre parenthèses les instructionsSELECT
individuelles et placer leORDER BY
ouLIMIT
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