2 votes

Retourner la même ligne deux fois si les deux conditions 'OR' sont vraies

J'essaie d'exécuter une requête SQL pour afficher les résultats d'un ensemble de combats dans une compétition. Les détails des combats sont stockés dans les champs combattant1, combattant2 et vainqueur. Ce que j'ai besoin de faire, c'est d'établir une liste de tous les combats, chaque combat apparaissant deux fois dans la liste - une fois avec par exemple

Competitor:fighter1, Opponent:fighter2, Winner:fighter1

et aussi, ailleurs dans la liste

Competitor:fighter2, Opponent:fighter1, Winner:fighter1

J'ai utilisé une union sql pour extraire les détails de chaque combat deux fois, et j'ai essayé d'attribuer des alias différents aux colonnes fighter1 et fighter2 pour les intervertir, mais je ne suis même pas sûr que cela soit possible.

Ma requête est la suivante (en omettant les éléments inutiles des autres tables)

SELECT wp_ema_fights.fighter1 AS competitor,
wp_ema_fights.fighter2 AS opponent, 
wp_ema_fights.winner AS winner
FROM wp_ema_fights
UNION ALL
SELECT wp_ema_fights.fighter1 AS opponent,
wp_ema_fights.fighter2 AS competitor,   
wp_ema_fights.winner AS winner
FROM wp_ema_fights
ORDER BY competitor

Cette requête affiche chaque combat deux fois, mais comme ceci :

Competitor:fighter1, Opponent:fighter2, Winner:fighter1
Competitor:fighter1, Opponent:fighter2, Winner:fighter1

Quelqu'un a-t-il une idée de la façon dont je peux intervertir les deux et ordonner la liste en fonction du combattant qui a été assigné comme "concurrent" à chaque fois ?

Merci d'avance.

2voto

Xophmeister Points 4281

Essayez :

SELECT   wp_ema_fights.fighter1 AS competitor,
         wp_ema_fights.fighter2 AS opponent,
         wp_ema_fights.winner AS winner
FROM     wp_ema_fights
UNION ALL
SELECT   wp_ema_fights.fighter2 AS competitor,
         wp_ema_fights.fighter1 AS opponent,
         wp_ema_fights.winner AS winner
FROM     wp_ema_fights
ORDER BY competitor

1voto

MatBailie Points 37610

En plus de la réponse de Xophmester, vous pouvez le faire avec une jointure au lieu d'une UNION. Cela présente l'avantage de ne charger les données sources qu'une fois plutôt que deux (ce qui est plus pertinent pour les très grands ensembles de données que pour les petits).

SELECT   CASE WHEN Mode.ID = 1 THEN wp_ema_fights.fighter1 ELSE wp_ema_fights.fighter2 END AS competitor,
         CASE WHEN Mode.ID = 2 THEN wp_ema_fights.fighter2 ELSE wp_ema_fights.fighter1 END AS opponent,
         wp_ema_fights.winner AS winner
FROM     wp_ema_fights
CROSS JOIN (SELECT 1 as ID UNION ALL SELECT 2 as ID) AS Mode
ORDER BY CASE WHEN Mode.ID = 1 THEN wp_ema_fights.fighter1 ELSE wp_ema_fights.fighter2 END

0voto

Alnitak Points 143355

Je pense que le UNION ignorera les noms de colonnes non concordants et ordonnera les colonnes simplement en fonction de l'ordre dans lequel elles apparaissent dans les deux fichiers SELECT déclarations.

Donc, il suffit d'échanger .fighter1 y .fighter2 dans la seconde SELECT .

0voto

Ryan Amies Points 1872

Essayez :

SELECT wp_ema_fights.fighter1 AS competitor,
wp_ema_fights.fighter2 AS opponent, 
wp_ema_fights.winner AS winner
FROM wp_ema_fights
UNION ALL
SELECT wp_ema_fights.fighter2 AS competitor,
wp_ema_fights.fighter1 AS opponent,   
wp_ema_fights.winner AS winner
FROM wp_ema_fights
ORDER BY competitor

0voto

onedaywhen Points 24594

Si votre produit SQL le supporte, changez UNION ALL à UNION CORRESPONDING .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X