Mysql 打印表中的每一行时保存计数列外观

Mysql 打印表中的每一行时保存计数列外观,mysql,sql,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 Inhabitants in New York: 2 Inhabitants in London:

因此,有一个问题我一直无法找到答案。假设您希望打印表中的每一行,如下所示:

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  
Inhabitants in New York: 2  
Inhabitants in London: 1
结果会怎样

1 Adam New York  
2 Eva London  
3 Jon New York
假设我同时想计算某个特定城市中有人居住的次数,并在遍历该表后保存该值以供打印;可能吗?例如,打印以下内容:

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  
Inhabitants in New York: 2  
Inhabitants in London: 1

这是可能的,还是您必须通过第二次按
位置分组来迭代整个表两次,并计算它们

编辑: 为了澄清,我知道我可以通过以下方式解决:

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

但现在我重复了两次。是否可以只在一次迭代中执行此操作?

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

select concat(concat(concat('Inhabitants in ',location),':'),total)
from
(select location, count(id) total
from tablename group by location)a

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

您可以选择运行两个查询—一个普通的
select*fromt
,和
select location,count(*)fromtgroup by location
,并按顺序显示结果。您还可以选择只运行一个
select*fromt
one,并对应用程序中的行进行计数,因为您仍在显示所有行:使用应用程序语言提供的任何类似字典的结构,将位置字符串作为键,将total integer作为值

如果您希望将其保留为单个查询,请使用ROLLUP查看
子句-。这肯定是一种不寻常的使用方式,但如果您
按位置、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

进行试验或检查,考虑处理应用程序代码中的数据显示问题。是的,可能!!你想怎么处理这件事。在应用程序端还是在过程中?在过程中,如在SQL语言中一样。“通过第二次按位置分组迭代整个表两次”并显示所显示的数据,这不是数据库作业,而是应用程序谢谢您的回答,这回答了我的问题。我很好奇,在表中多次迭代是否比只在一次迭代中找到一种方法更有效。我一定会在这个问题上做更多的实验。如果您担心性能,可以在
location
列上创建索引。这将使
选择位置,按位置从T组中计算(*)几乎是即时的查询。