所以有一个我无法找到答案的问题。假设您要打印表格中的每一行,如下所示:
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;
但是现在我要遍历两次。可以只进行一次迭代吗?
答案 0 :(得分:1)
一般来说,是的,显示表中的每一行并显示聚合的数据是两个单独的任务,应由应用程序而不是数据库处理。
您可以选择运行两个查询-简单的select * from T
和select 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];