MySQL在select查询中使用生成列

时间:2011-12-30 15:55:42

标签: php mysql

我有一个运行简短操作的MySQL查询(总计select语句中的计数),我想使用结果进行数学运算,但是我收到了一个错误。

表:

id  |   group   |   count   |
-----------------------------
1       1           3
2       1           2

查询:

select id, count,
  (select sum(count) from table group by group) as total,
  count/total as percent 
from table

错误是因为表中没有真正的“总”列。如何使查询起作用?

5 个答案:

答案 0 :(得分:22)

您可以将total保存为variable,然后在除法计算中使用它。

SELECT 
  `id`, `count`, 
   @total:=(SELECT sum(`count`) FROM `table` GROUP BY `group`) AS `total`, 
  `count`/@total AS `percent` 
FROM `table`

注意:GROUP是MySQL中的reserved word。你将它(以及所有其他字段/表名)括在反引号(`)中。

答案 1 :(得分:6)

您也可以在不引入变量的情况下执行此操作:

select id, 
   count, 
   (select sum(count) from `table` group by `group`) as total, 
   (select count/total) as percent 
from `table`;

产地:

+------+-------+-------+---------+
| id   | count | total | percent |
+------+-------+-------+---------+
|    1 |     3 |     5 |  0.6000 |
|    2 |     2 |     5 |  0.4000 |
+------+-------+-------+---------+
2 rows in set (0.05 sec)

答案 2 :(得分:1)

您的问题是内部查询需要每行生成1个结果,而不是每个组生成1个结果。您想在内部查询中添加where子句,如

where inner_table.group = outer_table.group

这样只返回一个结果。

答案 3 :(得分:0)

group是mysql中的保留字,table也是如此,您应该像以下一样使用它:

select id, count, (select sum(count) from `table` group by `group`) as total, count/total as percent from `table`

有关详细信息:MySQL Reserved Words

你会看到你实际上可以使用count,但无论如何我会把所有的表名和列名都放在引号中。

答案 4 :(得分:0)

这个问题已经有了MySql的答案,但是如果有人像我一样在这里登陆MSSql,那是错误的,就像下面对于MSSql一样简单

select id, count,
  total = (select sum(count) from table group by group),
  count/total as percent 
from table