views:

94

answers:

2

Here is the snapshot of the query that doesn't work since I added the 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

The error is : #1054 - Unknown column 'fin05_usager.idUsager' in 'where clause'

If I remove the fin05_usager.idUsager and use directly '6' it does work.

If I remove the union and use only one of the 2 select it works (what ever if I take the FROM fin05_usager_reputation or the other one FROM cc_badge, fin05_usager_badge.

Why when using the UNION the error about finding the idUsager appear and without the union no error is found?

Schema simplified:

fin05_usager: idUsager int(8)

fin05_usager_reputation : idUsager int(8), nombreReputationGagner int(4)

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

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

Note:

I cannot do the subquery directly in the query. I have to use it inside a subquery in the select because in real, the query is very big and already contain Group, etc.

+2  A: 

When you mention that removing the UNION causes things to work, I'm betting that you're removing this specifically:

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

This piece contains the refernce to fin05_usager.idusager that the mysql error is referring to. Subquery access is only allowed to one level - both ways. Nevermind that you really shouldn't be doing a SELECT within the SELECT clause. Here's how I reinterpret your query:

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
OMG Ponies
I have to have sub query... the real query has already Group and a lot of left join, etc. I cannot use directly the way you specified but I do understand your point.For the union, I have tried to remove both side and both work.Thanks to telling me that it only works on 1 level, didn't know that.
Daok
A: 

Alright,

The only way I found for the moment without doing a Group By in the main query (since in the real situation I can't because it does contain already a Group By clause) is to do it in 2 and to merge it with the code... not exaclty what I would like but it works at least:

 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

In the code I sum the nombreReputation1 and nombreReputation2.

Daok