【问题标题】:SQL query doesn't work when using UNION?使用UNION时SQL查询不起作用?
【发布时间】:2009-10-18 22:56:42
【问题描述】:

这是自从我添加了 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

错误是:#1054 - 'where 子句'中的未知列'fin05_usager.idUsager'

如果我删除 fin05_usager.idUsager 并直接使用“6”,它确实有效。

如果我删除联合并仅使用 2 个选择中的一个,它会起作用(如果我使用 FROM fin05_usager_reputation 或另一个 FROM cc_badge、fin05_usager_badge。

为什么在使用UNION的时候会出现找idUsager的错误,没有union就找不到错误?

架构简化:

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)

注意:

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

【问题讨论】:

  • 这里的架构简化了。和查询一样,它是一个简化版本,因为所有内容都包含很多内/左连接。
  • 另一种方法是将子选择查询移动到视图中,并将视图连接到当前查询中。
  • 如果您不提供整个查询(根据需要进行更改),我们无能为力,但我非常怀疑您无法将我的建议纳入您当前的查询中。跨度>
  • 我不能,因为我已经有一个 GROUP BY...
  • MySQL 从 5.0.1 开始支持视图:dev.mysql.com/doc/refman/5.0/en/create-view.html

标签: sql mysql mysql-error-1054


【解决方案1】:

当您提到删除 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 的引用。子查询访问只允许一个级别 - 两种方式。没关系,您真的不应该在 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

【讨论】:

  • 我必须有子查询...真正的查询已经有组和很多左连接等。我不能直接使用你指定的方式,但我明白你的意思。对于工会,我试图删除双方和双方的工作。感谢告诉我它只适用于 1 级,不知道。
【解决方案2】:

好的,

我目前在主查询中不使用 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

在代码中,我将 nombreReputation1 和 nombreReputation2 相加。

【讨论】:

    猜你喜欢
    • 2011-04-13
    • 2012-12-23
    • 2012-11-28
    • 2010-11-18
    • 2015-04-18
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多