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组中计算(*)几乎是即时的查询。