MySQL:使用同一行上的列值进行计数
如何使用other列中的值,以便使用所有相同类型的总和创建另一列 e、 g 输出:MySQL:使用同一行上的列值进行计数,mysql,Mysql,如何使用other列中的值,以便使用所有相同类型的总和创建另一列 e、 g 输出: +---------+------+----------------+ | name | team | member_counter | +---------+------+----------------+ | Michael | red | 3 | | Lebron | blue | 2 | | Ben | red |
+---------+------+----------------+
| name | team | member_counter |
+---------+------+----------------+
| Michael | red | 3 |
| Lebron | blue | 2 |
| Ben | red | 3 |
| Tiger | red | 3 |
| John | blue | 2 |
+---------+------+----------------+
正如你所看到的,这里有3个红色和2个蓝色。那么,我是否可以使用前面列的值?countteam=上一列?作为成员\u计数器?只需执行子查询:
select *, (select count(*) from table t2 where t1.team = t2.team) as member_counter
from table t1
编辑:
我查了一百万行。此查询的执行计划与接受答案的查询的执行计划99%相同。使用时间统计信息,两个查询的执行效果完全相同。使用IO统计信息时,两个查询的执行效果完全相同。现在我不明白为什么我被否决了。唯一的区别是我的版本更短,更容易理解
编辑2:
这是工作小提琴:
select *, (select count(*) from tmp t2 where t1.team = t2.team) as member_counter
from tmp t1
您应该使用所有团队的子选择进行连接
select name, team, teams.count
from names
join (select team, count(1) as count from names group by team) as teams
using (team);
您可以联接到包含团队计数的派生表:
这可能比相关子查询执行得更好
如果您只想得到这样的结果,可以执行以下操作:
SELECT T1.name,T1.team,T2.member_count
FROM TableName T1 JOIN
(SELECT name,team,count(team) as member_count
FROM TableName
GROUP BY team) T2 ON T1.team=T2.team
结果:
name team member_count
----------------------------
Michael red 3
Lebron blue 2
Ben red 3
Tiger red 3
John blue 2
例如
如果试图向表中添加一个以上的列成员计数器,可以执行以下操作:
ALTER TABLE TableName
ADD member_counter INT NULL
UPDATE TableName a
JOIN
(SELECT name,team,COUNT(team) as member_counter
FROM TableName b
GROUP BY team) b ON a.name = b.name AND a.team=b.team
SET a.member_counter = b.member_counter
例如
@安吉洛:那么,请看我答案中的第一部分。除了语法不正确之外,这还有很糟糕的性能,因为这将对表中的每一行运行一次从属子查询。@AndreasWederbrand,你确定吗?可以重读一些手册吗?第二,引擎不会愚蠢到为外部查询中的每一行计算相同的子查询……我敢肯定。你知道你的答案和你的小提琴不一样,所以你也发现了错误。。。引擎将为每个团队评估一次子查询,在这个简单的例子中,仅评估两次。如果有10种颜色,它会评估10次。@AndreasWederbrand,你认为我是瞎子吗?告诉我语法错误@AndreasWederbrand,那么我在哪里发现错误并改正了呢两个查询都是相同的,并且都在工作。引擎不会为每一行计算子查询。这是不对的。在这两个版本中,都有2次扫描表。首先构造字典的哈希表。这是你得到不同团队和计数的地方。这两个查询都对此进行表扫描。然后,第二个表扫描输出和哈希连接。试一试,看看这两个查询计划的人。。。。
name team member_count
----------------------------
Michael red 3
Lebron blue 2
Ben red 3
Tiger red 3
John blue 2
ALTER TABLE TableName
ADD member_counter INT NULL
UPDATE TableName a
JOIN
(SELECT name,team,COUNT(team) as member_counter
FROM TableName b
GROUP BY team) b ON a.name = b.name AND a.team=b.team
SET a.member_counter = b.member_counter