2016-05-26 2 views
1

Désolé pour cette question de débutant mais je me suis arraché les cheveux ces dernières heures sur quelque chose qui ne pourrait être plus simple.Union tous ne semblent pas fonctionner comme prévu. Retourner moins de lignes

J'ai une table (single_elim):

id_tournament phase player1 player2 
    1    1  1   2 
    1    1  3   4 
    1    1  5   10 

et je suis en train d'écrire une requête qui donne un joueur me donne son adversaire. Malheureusement je ne peux pas savoir si le joueur sera dans la colonne player1 ou le joueur 2 (mais je sais qu'ils sont mutuellement exclusifs) colonne donc j'attendre une solution possible d'être:

SELECT p AS opponent FROM (

    (
     SELECT player1 as p FROM single_elim 
     WHERE 
      id_tournament = 1 AND 
      phase = 1 AND 
      player2 = 4 

    ) UNION ALL (

     SELECT player2 as p FROM single_elim 
     WHERE 
      id_tournament = 1 AND 
      phase = 1 AND 
      player1 = 4 
    ) 

) x; 

Cependant, le retour de l'instruction 0 rangées.

Si je lance la seule instruction:

SELECT player1 as p FROM single_elim 
    WHERE 
     id_tournament = 1 AND 
     phase = 1 AND 
     player2 = 4 

En supposant que player2 sera dans la colonne 4, alors il fonctionne et je reçois un résultat de la ligne avec p = 3. J'ai aussi essayé avec UNION et i J'ai aussi essayé différentes sortes de requêtes que je m'attendais à travailler, ma conclusion est qu'il me manque quelque chose de fondamental sur le fonctionnement de l'union, mais après quelques recherches, je n'ai pas réussi à le comprendre.

Un autre exemple de requête qui a travaillé seul, mais pas avec un syndicat était:

SELECT * FROM (

     SELECT COUNT(*) as n, player2 as p FROM helper 
     WHERE id_tournament = 1 AND player1 = 4 AND phase = 1 

    ) UNION ALL (

     SELECT COUNT(*) as n, player1 as p FROM helper 
     WHERE id_tournament = 1 AND player2 = 4 AND phase = 1 

    ) 
) x WHERE n = 1; 

Toute aide est appréciée, merci beaucoup.

Répondre

0

Le comportement que vous observez semble étrange, le premier UNION devrait avoir retourné une ligne. (Les valeurs de données sont-elles des types entiers ou des types de chaînes?)

Cependant, vous ne devriez pas avoir besoin de UNION sauf s'il s'agit d'une énorme table où vous devez optimiser l'utilisation de l'index autant que possible.

SELECT CASE WHEN player1 = 4 THEN player2 ELSE player1 END as p 
    FROM single_elim 
    WHERE id_tournament = 1 
    AND phase = 1 
    AND (player1 = 4 OR player2 = 4) 
    ; 
+0

Les valeurs Tha sont toutes Ints. Oui, votre solution fonctionne! Et il semble être beaucoup plus élégant. Merci beaucoup. Je me suis dit que ça devait être un bug dans mySql 5.6 mais je n'ai trouvé aucune indication sur ce qui est vraiment étrange. – WiserTheBassist

0

Je pense que les parenthèses sont en train de tout chambouler. Dans tous les cas, vous n'avez pas besoin de la requête de sélection d'emballage, l'union suffit. celui-ci fonctionne bien:

SELECT player1 as p FROM single_elim 
    WHERE 
     id_tournament = 1 AND 
     phase = 2 AND 
     player2 = 4 
UNION ALL 
    SELECT player2 as p FROM single_elim 
    WHERE 
     id_tournament = 1 AND 
     phase = 2 AND 
     player1 = 4;