代码之家  ›  专栏  ›  技术社区  ›  Patrick Desjardins

使用联合时SQL查询不起作用?

  •  1
  • Patrick Desjardins  · 技术社区  · 16 年前

    这是自我添加联合后不起作用的查询的快照。

    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-“WHERE子句”中的未知列“fin05_usager.idusager”

    如果我移除fin05-usager.idusager并直接使用“6”,它会起作用。

    如果我移除联盟并且只使用2个选择中的一个,那么它会起作用(如果我从fin05 ousager_信誉或者从cc_徽章、fin05 ousager_徽章中选择另一个怎么办?

    为什么在使用联合时会出现有关查找idusager的错误,如果不使用联合,则不会发现错误?

    架构简化:

    图5:idusager int(8)

    FIN05-声誉:idusager int(8),nombreusationgagner int(4)

    抄送徽章:idbadge int(4),valeurenreputation int(4)

    fin05使用者徽章:idusager int(8),idbadge int(4)

    注:

    我不能在查询中直接执行子查询。我必须在select中的子查询中使用它,因为在real中,查询非常大并且已经包含group等。

    2 回复  |  直到 16 年前
        1
  •  2
  •   OMG Ponies    16 年前

    当你提到取消工会会使事情发生作用时,我敢打赌你会特别取消这一点:

    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
    

    这篇文章包含了 fin05_usager.idusager 指的是MySQL错误。子查询访问只允许一个级别-双向。千万不要在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
    
        2
  •  0
  •   Patrick Desjardins    16 年前

    好吧,

    目前,我在主查询中没有执行group by的唯一方法(因为在实际情况下,我不能这样做,因为它已经包含了group by子句)是在2中执行,并将其与代码合并…不完全是我想要的,但它至少起作用:

        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
    

    在代码中,我总结了nombre信誉1和nombre信誉2。