显示在两列中的Mysql计数id
我有一个包含以下列的表: 身份证件 用户id 球员 游戏者离开 日期 我需要做一份报告,统计每个球员在场内和场外的重复次数。 例如,如果我在表中按各自的顺序有这两行显示在两列中的Mysql计数id,mysql,sql,count,Mysql,Sql,Count,我有一个包含以下列的表: 身份证件 用户id 球员 游戏者离开 日期 我需要做一份报告,统计每个球员在场内和场外的重复次数。 例如,如果我在表中按各自的顺序有这两行 id user_id player_in player_out 1 1 88 56 2 7 77 88 播放器88的结果为2,播放器56和77的结果为1,使用使用union all的子查询将两列合并为一列,然后使用标准计数*: 注:因此,根据对本答案的评论中的进一步要求,该查
id user_id player_in player_out
1 1 88 56
2 7 77 88
播放器88的结果为2,播放器56和77的结果为1,使用使用union all的子查询将两列合并为一列,然后使用标准计数*: 注:因此,根据对本答案的评论中的进一步要求,该查询包含了详细信息和详细信息的单独总计
select
player_id,
count(*) as total,
sum(ins) as ins,
sum(outs) as outs
from (
select
player_in as player_id,
1 as ins,
0 as outs
from mytable
union all
select player_out, 0, 1
from mytable
) x
group by player_id
注意:您必须使用union all而不仅仅是union,因为union会删除重复项,而union all不会。您可以使用对两行虚拟表的交叉联接来取消PIVOT player_*列,然后将结果分组,如下所示:
SELECT
player,
COUNT(*) AS total_count
FROM (
SELECT
CASE WHEN x.is_in THEN t.player_in ELSE t.player_out END AS player
FROM mytable t
CROSS JOIN (SELECT TRUE AS is_in UNION ALL SELECT FALSE) x
) s
GROUP BY
player
;
SELECT
player,
COUNT( is_in OR NULL) AS in_count,
COUNT(NOT is_in OR NULL) AS out_count,
COUNT(*) AS total_count
FROM (
SELECT
x.is_in,
CASE WHEN x.is_in THEN t.player_in ELSE t.player_out END AS player
FROM mytable t
CROSS JOIN (SELECT TRUE AS is_in UNION ALL SELECT FALSE) x
) s
GROUP BY
player
;
也就是说,原始表的每一行基本上都是重复的,并且每一行的副本都提供player_in或player_out,这取决于派生表的is_in列是TRUE还是FALSE,以形成一个player列。这种取消激励的方法可能比UNION方法性能更好,因为这样物理表只传递一次,但您需要测试和比较这两种方法,以确定在您的特定情况下,这种方法是否有任何实质性的好处
要计算输入和输出计数,正如您在对上述答案的评论中所要求的,您可以将我的原始建议扩展如下:
SELECT
player,
COUNT(*) AS total_count
FROM (
SELECT
CASE WHEN x.is_in THEN t.player_in ELSE t.player_out END AS player
FROM mytable t
CROSS JOIN (SELECT TRUE AS is_in UNION ALL SELECT FALSE) x
) s
GROUP BY
player
;
SELECT
player,
COUNT( is_in OR NULL) AS in_count,
COUNT(NOT is_in OR NULL) AS out_count,
COUNT(*) AS total_count
FROM (
SELECT
x.is_in,
CASE WHEN x.is_in THEN t.player_in ELSE t.player_out END AS player
FROM mytable t
CROSS JOIN (SELECT TRUE AS is_in UNION ALL SELECT FALSE) x
) s
GROUP BY
player
;
正如您所看到的,派生表现在以其自身的权限另外返回is_in列,并且该列用于两个条件聚合中,用于计算一个玩家进出的次数。如果您感兴趣,将解释OR NULL技巧
您还可以将COUNTcondition或NULL条目重写为SUMcondition。这肯定会缩短两个表达式,有些人还发现求和法更清晰/更优雅。在这两种情况下,性能都不会有差异,所以选择更适合您口味的方法
可以找到第二个查询的SQL Fiddle演示。+1我也想知道这一点。如果选择COUNTplayer\u in,则从myTable GROUP BY player\u out中选择COUNTplayer\u out,作为工作中的myTable GROUP BY player\u中的player\u out?+1。很好。我觉得你很聪明。MySQL抛出这个错误:1242-子查询返回超过1行。为什么?这很好,我想,我有一个多行的表,我不能一个一个地数来检查这个,但我认为这很好。有没有办法优化查询?你可以在player\u in和player\u out上分别设置索引。除此之外,这个查询非常简单-应该可以很好地执行。好的!还有一个问题,我怎样才能得到每个球员的3个项目,输入输出和总数?非常感谢。这实际上是一个不同的问题,但请参阅答案以了解如何进行额外编辑。添加了逗号。我在我的iPhone上输入了这个。。。发现这样的错误可能会更难