Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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计数id_Mysql_Sql_Count - Fatal编程技术网

显示在两列中的Mysql计数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 球员 游戏者离开 日期 我需要做一份报告,统计每个球员在场内和场外的重复次数。 例如,如果我在表中按各自的顺序有这两行

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上输入了这个。。。发现这样的错误可能会更难