2009-10-18 2 views
1

다음은 연합을 추가 한 이후로 작동하지 않는 쿼리의 스냅 샷입니다.UNION을 사용할 때 SQL 쿼리가 작동하지 않습니까?

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 

오류가 있습니다 : # 1054 - 나는 fin05_usager.idUsager를 제거하고 직접 사용하는 경우 'where 절'

에서 알 수없는 열 'fin05_usager.idUsager' '6'이 작업을 수행합니다.

나는 fin05_usager_reputation 또는 cc_badge에서 다른 하나 fin05_usager_badge에서을 그 어느 경우 어떻게 (작동을 선택합니다.

을 찾는 것에 대해 노조에게 오류를 사용할 때 왜 노동 조합을 제거하고 단 하나의 2의 사용하는 경우 idUsager가 나타나고 노조없이 오류가 발견되지

스키마가 단순화 :

fin05_usager : idUsager의 INT (8)

fin05_usager_reputation : idUsager의 INT (8), nombreReputationGagn 어 INT (4)

cc_badge : idBadge의 INT (4) valeurEnReputation는 INT (4)

fin05_usager_badge : idUsager의 INT (8) idBadge의 INT (4)

참고

I 쿼리에서 직접 하위 쿼리를 수행 할 수 없습니다. 사실, 쿼리가 매우 크고 이미 그룹 등이 포함되어 있기 때문에 select의 하위 쿼리에서 사용해야합니다.

+0

스키마 게시 –

+0

여기 스키마가 단순화되었습니다. 쿼리는 모든 것이 내부/왼쪽 조인을 많이 포함하기 때문에 단순화 된 버전입니다. –

+0

또 다른 대안은 subselect 쿼리를 뷰로 이동하고 뷰를 현재 쿼리에 조인하는 것입니다. –

답변

0

좋아, 내가 그것을 수행 할 수 없기 때문에 실제 상황에 있기 때문에 (주 쿼리 그룹에 의해 수행하지 않고 순간을 발견

유일한 방법 : 여기 내가 당신의 쿼리를 재 해석 방법 나는 nombreReputation1 요약 코드에서

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 

과 : 그룹)이 조항에 의해 이미 포함 2 그것을하고 코드와 병합 ...하지 exaclty 싶습니다하지만 적어도 작동 무엇을하는 것입니다 nombreReputation2.

2

UNION을 제거하면 작동하는 것으로 간주 될 때, 특히이 제거 재 :

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 

이 조각 MySQL의 에러가 참조된다 fin05_usager.idusager에 refernce를 포함. 하위 쿼리 액세스는 두 가지 방법으로 한 수준에서만 허용됩니다. 절대로 SELECT 절에서 SELECT를 수행하면 안됩니다.

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

하위 쿼리가 있어야합니다 ... 실제 쿼리는 이미 그룹과 왼쪽 조인이 많이 있습니다. 사용자가 지정한 방식대로 직접 사용할 수는 없지만 사용자의 이해가 가능합니다. . 노조의 경우 양쪽 모두를 제거하려고했습니다. 그것이 1 레벨에서만 작동한다는 것을 알려 주셔서 감사합니다. –