【问题标题】:MySQL Single Row Returned From Temporary Table从临时表返回的 MySQL 单行
【发布时间】:2010-11-15 19:07:49
【问题描述】:

我正在对数据库运行以下查询:

CREATE TEMPORARY TABLE med_error_third_party_tmp
SELECT `med_error_category`.description AS category, `med_error_third_party_category`.error_count AS error_count
FROM
    `med_error_category` INNER JOIN `med_error_third_party_category` ON med_error_category.`id` = `med_error_third_party_category`.`category`
WHERE
    year = 2003
GROUP BY `med_error_category`.id;

唯一的问题是,当我创建临时表并对其执行 select * 时,它会返回多行,但上面的查询只返回一行。除非我指定 GROUP BY,否则它似乎总是返回一行,但随后它返回 1.0 的百分比,就像使用 GROUP BY 一样。

SELECT category, 
       error_count/SUM(error_count) AS percentage
  FROM med_error_third_party_tmp;

以下是服务器规格:
服务器版本:5.0.77
协议版本:10
服务器:通过 UNIX 套接字的 localhost

有没有人发现导致问题的原因?

【问题讨论】:

    标签: sql mysql group-by aggregate-functions


    【解决方案1】:

    如果任何列未包含在聚合函数中(即:MIN、MAX、COUNT、SUM、AVG 等),标准 SQL 要求您指定 GROUP BY 子句,但 MySQL supports "hidden columns in the GROUP BY" -- 这就是原因:

    SELECT category, 
           error_count/SUM(error_count) AS percentage
      FROM med_error_third_party_tmp;
    

    ...运行没有错误。该功能的问题在于,由于没有 GROUP BY,因此 SUM 是整个表的 error_count 列的 SUM。但是其他列的值是完全任意的——它们不能被依赖。

    这个:

    SELECT category, 
           error_count/(SELECT SUM(error_count)
                          FROM med_error_third_party_tmp) AS percentage
      FROM med_error_third_party_tmp;
    

    ...将在每行的基础上为您提供一个百分比——类别值将被复制,因为没有分组。

    这个:

      SELECT category, 
             SUM(error_count)/x.total AS percentage
        FROM med_error_third_party_tmp
        JOIN (SELECT SUM(error_count) AS total
                FROM med_error_third_party_tmp) x 
    GROUP BY category
    

    ...将为您提供每个类别的 error_count 值总和与整个表的 error_count 值总和的百分比。

    【讨论】:

    • 好的,关于 GROUP BY 完全有道理。我试图将临时表的每行错误百分比除以总数。正如你所说,这不能依赖。
    • 我也打算按类别分组。
    • @Khirok:我提供了两个查询,并解释了您对其中一个结果的期望。
    • 首先谢谢。唯一的问题是我遇到了一个问题,我认为是因为它试图打开临时表两次。这是错误:#1137 - 无法重新打开表:'med_error_third_party_tmp'
    • @Khirok:用您正在运行的内容更新您的问题 - 我看不出我的任何一个查询如何返回该错误,但我不使用临时表...跨度>
    【解决方案2】:

    另一种方法 - 没有临时表作为单独的项目...

    select category, error_count/sum(error_count) "Percentage"
    from (SELECT mec.description category
              ,  metpc.error_count 
          FROM med_error_category mec
             , med_error_third_party_category metpc
          WHERE mec.id = metpc.category
          AND year = 2003 
          GROUP BY mec.id
         );
    

    我想你会注意到百分比在类别中是不变的。这可能不是您想要的 - 您可能还想按类别对错误进行分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多