Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:使用同一行上的列值进行计数_Mysql - Fatal编程技术网

MySQL:使用同一行上的列值进行计数

MySQL:使用同一行上的列值进行计数,mysql,Mysql,如何使用other列中的值,以便使用所有相同类型的总和创建另一列 e、 g 输出: +---------+------+----------------+ | name | team | member_counter | +---------+------+----------------+ | Michael | red | 3 | | Lebron | blue | 2 | | Ben | red |

如何使用other列中的值,以便使用所有相同类型的总和创建另一列

e、 g

输出:

+---------+------+----------------+
|  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