2009-10-18 8 views
1

Voici l'instantané de la requête qui ne fonctionne pas depuis que j'ai ajouté l'Union.La requête SQL ne fonctionne pas avec UNION?

SELECT fin05_usager.idUsager, 
     (SELECT sum(nombreReputation) as nombreReputation 
      FROM (SELECT SUM(nombreReputationGagner) as nombreReputation 
       FROM fin05_usager_reputation 
       WHERE fin05_usager_reputation.idUsager = fin05_usager.idUsager 
      GROUP BY fin05_usager_reputation.idUsager 
     UNION 
       SELECT SUM(cc_badge.valeurEnReputation) as nombreReputation 
        FROM cc_badge, fin05_usager_badge 
       WHERE fin05_usager_badge.idBadge = cc_badge.idBadge 
        AND fin05_usager_badge.idUsager = fin05_usager.idUsager) as repuUnion  
     ) as repu 
FROM fin05_usager 
WHERE fin05_usager.idUsager = 6 

L'erreur est: # 1054 - Unknown column 'fin05_usager.idUsager' dans 'où la clause'

Si je supprime le fin05_usager.idUsager et utiliser directement '6' il fonctionne.

Si je retire le syndicat et utiliser un seul des 2 sélectionnez cela fonctionne (ce que jamais si je prends FROM fin05_usager_reputation ou l'autre du cc_badge, fin05_usager_badge.

Pourquoi lorsque vous utilisez l'UNION l'erreur de trouver l'IDUsager apparaissent et sans l'union aucune erreur se trouve

schéma simplifié:

fin05_usager: IDUsager int (8)

fin05_usager_reputation: IDUsager int (8), nombreReputationGagn er int (4)

cc_badge: idBadge int (4), valeurEnReputation int (4)

fin05_usager_badge: IDUsager int (8), idBadge int (4)

Note:

I ne peut pas faire la sous-requête directement dans la requête. Je dois l'utiliser à l'intérieur d'une sous-requête dans la sélection car en réalité, la requête est très grande et contient déjà un groupe, etc.

+0

Veuillez poster votre schéma –

+0

Ici le schéma simplifié. Comme la requête, c'est une version simplifiée car tout contient beaucoup de jointure interne/gauche. –

+0

Une alternative serait de déplacer la requête sous-sélection dans une vue et de rejoindre la vue dans votre requête actuelle. –

Répondre

0

D'accord,

La seule façon que je trouve pour le moment sans faire un groupe par la requête principale (puisque dans la situation réelle, je ne peux pas parce qu'il fait contient déjà un groupe par la clause) est de le faire en 2 et de la fusionner avec le code ... pas exaclty ce que je voudrais, mais il fonctionne au moins:

SELECT fin05_usager.idUsager, 

       (SELECT sum(nombreReputationGagner) as nombreReputation1 
       FROM fin05_usager_reputation 
       WHERE fin05_usager_reputation.idUsager = fin05_usager.idUsager 
       group by fin05_usager_reputation.idUsager) as nombreReputation1 
      , 
       (SELECT sum(cc_badge.valeurEnReputation) as nombreReputation2 
       FROM cc_badge, fin05_usager_badge 
       WHERE fin05_usager_badge.idBadge = cc_badge.idBadge 
       AND fin05_usager_badge.idUsager = fin05_usager.idUsager) as nombreReputation2 

    FROM 
     fin05_usager 
     where fin05_usager.idUsager = 6 

dans le code I et la somme des nombreReputation1 nombreReputation2.

2

Lorsque vous mentionnez que le retrait de l'UNION fait que les choses fonctionnent, je parie que vous ' re suppression de cette spécifiquement:

UNION 
SELECT SUM(cc_badge.valeurEnReputation) as nombreReputation 
    FROM cc_badge, fin05_usager_badge 
WHERE fin05_usager_badge.idBadge = cc_badge.idBadge 
    AND fin05_usager_badge.idUsager = fin05_usager.idUsager 

cette pièce contient le refernce à fin05_usager.idusager que l'erreur mysql fait référence. L'accès aux sous-requêtes est uniquement autorisé à un niveau - dans les deux sens. Peu importe que vous ne devriez pas faire un SELECT dans la clause SELECT. Voici comment je réinterprète votre requête:

SELECT fu.idUsager, 
     a.nombreReputation + b.nombreReputation AS repuunion 
    FROM fin05_usager fu 
    JOIN (SELECT fur.idusager, 
       SUM(fur.nombreReputationGagner) as nombreReputation 
      FROM fin05_usager_reputation fur 
     WHERE fur.idUsager = fin05_usager.idUsager 
     GROUP BY fur.idUsager) a ON a.idusager = fu.idusager 
    JOIN (SELECT fub.idUsager, 
       SUM(ccb.valeurEnReputation) as nombreReputation 
      FROM cc_badge ccb 
      JOIN fin05_usager_badge fub ON fub.idbadge = ccb.idbadge 
     GROUP BY fub.idUsager) b ON b.idusager = fu.idusager 
WHERE fu.idUsager = 6 
+0

Je dois avoir une sous-requête ... la vraie requête a déjà Groupe et beaucoup de jointure à gauche, etc. Je ne peux pas utiliser directement la façon dont vous avez spécifié mais je comprends votre point . Pour l'union, j'ai essayé d'enlever les deux côtés et les deux travaux. Merci de me dire que cela ne fonctionne que sur 1 niveau, ne le savais pas. –

Questions connexes