2010-11-15 84 views
0

我针对数据库运行以下查询:MySQL的单行返回从临时表

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,但它返回的百分比应该像GROUP BY一样。

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

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

是否有人看到这个就导致一个问题问题?

回答

3

标准SQL要求你指定GROUP BY子句中如果有一列不裹在聚合函数(IE:MIN,MAX,COUNT,SUM,AVG等),但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值VS的ERROR_COUNT值的整个表的总和类别的总和类别的百分比。

+0

+1,用于正确指出逻辑问题 – Randy 2010-11-15 19:38:03

+0

好吧,这样可以让我们了解GROUP BY。我试图得到临时表中每行错误的百分比除以总数。正如你所说,这不能被依赖。 – Khirok 2010-11-15 21:39:47

+0

我也将按类别分组。 – Khirok 2010-11-15 21:40:11

0

另一种方式来做到这一点 - 没有临时表作为单独的项目...

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 
    ); 

我想你会发现,百分比超过类别不变。这可能不是您想要的 - 您可能也想按类别对错误进行分组。