我在报告工具中使用mysql。 我有一个临时表,我填写一些查询,然后显示临时表中的数据。
我的表结构是
Prim_key starttime endtime timediff
1 2012-07-20 00:00:0 2012-07-22 10:55:32 39332
2 2012-07-20 04:50:13 2012-07-22 10:55:32 158719
3 2012-07-20 10:00:00 2012-07-22 00:00:05 5
我需要显示一个表,其中包含时间百分比< 30,在30-45和之间; 45。 我写了以下查询,但是我收到状态1137的错误 - 无法重新打开表:'t_results'
Expected result:
| % of less than 30 min | % of between 30 - 45 | % of greater than 45 mins |
查询
SELECT prim_key key, (
SELECT count(*)*100 / (
SELECT count(*)
FROM t_results
WHERE timediff > 0 )
FROM t_results
WHERE (timediff /60) < 30
) less30, (
SELECT count(*)*100 / (
SELECT count(*)
FROM t_results
WHERE timediff > 0 )
FROM t_results
WHERE (timediff /60) >= 30 and (timediff /60) <= 45
) bet3045,
(SELECT count(*)*100 / (
SELECT count(*)
FROM t_results
WHERE timediff > 0 )
FROM t_results
WHERE (timediff /60) > 45
) great45
FROM t_results
WHERE 1 = 1 AND 1 =1
GROUP BY prim_key
还有另一种写作方式吗?
答案 0 :(得分:2)
在同一查询中,临时表不能被复制两次。
http://bugs.mysql.com/bug.php?id=10327
修改强>
实际上,有一点想法(因为你需要一个支点)我相信你的查询将是
的形式(第二次编辑,格式化为百分比)
SET @numRows := (SELECT COUNT(*) FROM t_results WHERE timediff > 0 );
SELECT COUNT(CASE WHEN (timediff /60) < 30 THEN timediff ELSE NUll END) * 100 /@numRows less30,
COUNT(CASE WHEN (timediff /60) >= 30 and (timediff /60) <= 45 THEN timediff ELSE NUll END) * 100 /@numRows bet3045,
COUNT(CASE WHEN (timediff /60) > 45 THEN timediff ELSE NUll END) * 100 /@numRows great45
FROM t_results WHERE timediff > 0
应该做的伎俩。除非我犯了一个相当愚蠢的错误。我通常做的事情:))
答案 1 :(得分:1)
@ user1051643是正确的,您不能在查询中多次使用临时表。可惜,迟钝等等,但就是这样。
那就是说,你想用你的查询实现什么?令我感到奇怪的是,您的主查询执行GROUP BY prim_key。假设prim_key是主键,并且您的查询没有连接,那么这似乎是多余的,因为GROUP BY查询结果的概念主键始终完全由GROUP BY列表中的列定义。即你的GROUP BY是多余的。
然后在您的SELECT列表中,您对t_results执行了一堆聚合查询,但它们似乎都与主查询的当前行无关。这意味着您可以轻松地,无需任何性能损失将其重写为一系列单独的查询。但最重要的是它让我觉得你还没有定义你想要解决的问题。
更新:
select 100 * sum(
if (timediff < 30*60, 1, 0)
) / count(timediff)
AS "% of less than 30 min"
, 100 * sum(
if (timediff between 30*60 and 45*60, 1, 0)
) / count(timediff)
AS "% of between 30 - 45"
, 100 * sum(
if (timediff > 45*60, 1, 0)
) / count(timediff)
AS "% of greater than 45 mins"
from t_results