在打印表中的每一行时,保存COUNT列的外观

时间:2018-09-13 09:11:32

标签: mysql sql

所以有一个我无法找到答案的问题。假设您要打印表格中的每一行,如下所示:

ID  | Name | Location
----+------+----------
1   | Adam | New York
2   | Eva  | London
3   | Jon  | New York

这将给出结果

1 Adam New York  
2 Eva London  
3 Jon New York

假设我同时想计算某人居住在特定城市的出现次数,并在遍历表格后将其保存为打印值;那可能吗?例如,打印以下内容:

1 Adam New York  
2 Eva London  
3 Jon New York  
Inhabitants in New York: 2  
Inhabitants in London: 1

这是否可能,或者您需要通过第二次按Location分组并计数来遍历整个表两次?

编辑: 为了澄清,我知道我可以通过调用以下方法解决此问题:

SELECT * FROM table; 
SELECT CONCAT('Inhabitants in ', Location, ': ', COUNT(ID))
FROM table
GROUP BY Location;

但是现在我要遍历两次。可以只进行一次迭代吗?

2 个答案:

答案 0 :(得分:1)

一般来说,是的,显示表中的每一行并显示聚合的数据是两个单独的任务,应由应用程序而不是数据库处理。

您可以选择运行两个查询-简单的select * from Tselect location, count(*) from T group by location,并顺序显示结果。您还可以选择仅运行select * from T,并计算应用程序中的行数,因为无论如何您都将显示所有行:使用您的应用程序语言提供的任何类似于字典的结构,并为key和运行总整数值。

如果您希望将其保留为单个查询,请查看WITH ROLLUP子句-https://dev.mysql.com/doc/refman/8.0/en/group-by-modifiers.html。当然,这将是一种不寻常的使用方式,但是如果您group by location, id然后稍微改动一下结果,就可以得到想要的东西。

select if(id is null, CONCAT('Inhabitants in ', location, ': ', cnt), concat(id, ' ', name, ' ', location))
from
(
select id, location, name, count(*) cnt
from t
where location is not null
group by location, id with rollup
) q
where location is not null
order by id is null, id asc;

与两个简单的查询相比,尽管性能可能令人怀疑。您应该尝试使用EXPLAIN或进行检查。

答案 1 :(得分:0)

尝试下面的查询,使用子查询

whileprintingrecords;

stringvar array x := split({Person.Name},"</");
numbervar i:= 0 ;
numbervar j := unbound(x);
stringvar array y;
numbervar k ;

for i := 1 to j do(
if instr(x[i],"<Name>") <> 0 then(
k := k+1;
redim preserve y[j];
y[k] := extractstring(x[i],"<Name>","</Name>")) [i]);

stringvar Name := y[k];