Mysql count id that appear in 2 columns
我有一个包含这些列的表格:
-
ID
-
用户身份
-
player_in
-
player_out
-
日期
我需要在 player_in 字段中计算每个"玩家"重复次数的报告,就像在 player_out 字段中一样。
例如,如果我在表中有这 2 行(按相应的顺序)。
1 2 3
| id user_id player_in player_out
1 1 88 56
2 7 77 88 |
玩家 88 的结果将是 2,而玩家 56 和 77 的结果将是 1
- 1 我也想知道。
-
SELECT COUNT(player_in), (SELECT COUNT(player_out) FROM myTable GROUP BY player_out) AS player_out FROM myTable GROUP BY player_in 会起作用吗?
-
1.不错的方式。我觉得你很聪明。
-
MySQL 抛出此错误:#1242 - 子查询返回多于 1 行。为什么?
使用使用 union all 的子查询将两列合并为一列,然后使用标准 count(*):
注意:因此,根据对此答案的评论中的进一步要求,查询包括进出的个人总数。
注意:您必须使用 union all(而不仅仅是 union),因为 union 会删除重复项,而 union all 不会。
- 我认为这很好用,我有一张有多行的表,我不能一一计算来检查它,但我认为这很好用。有什么方法可以优化查询吗?
-
您可以在 player_in 和 player_out 上放置单独的索引。除此之外,查询尽可能简单 - 应该可以正常运行。
-
行!还有一个问题,我怎样才能得到每个玩家的 3 个项目,"ins" "outs" 和 "total"?非常感谢。
-
这实际上是一个不同的问题,但请参阅奖励编辑的答案以了解如何。
-
我已经在我的回答中编辑了查询,以按照您的要求返回总数、总输入和总输出。复制粘贴并尝试。
-
这项工作非常好,谢谢!如果您愿意,请编辑您的答案并在 player_id 后添加一个逗号,这是唯一的错误。再次,谢谢!!
-
添加了逗号。 (我在 iPhone 上输入了这个……这样的错误可能更难发现)
您可以使用交叉连接到 2 行虚拟表来取消透视 player_* 列,然后对结果进行分组,如下所示:
也就是说,原始表的每一行本质上都是重复的,并且该行的每个副本都提供 player_in 或 player_out,具体取决于派生表的 is_in 列是 TRUE 还是 FALSE,形成单个 player 列。这种反透视方法可能比@Bohemian 建议的 UNION 方法执行得更好,因为这种方式(物理)表只传递一次(但您需要测试和比较这两种方法以确定这种方法是否有任何实质性好处您的具体情况)。
要计算进出计数,正如您在对上述答案的评论之一中所要求的那样,您可以像这样扩展我原来的建议:
如您所见,派生表现在还单独返回 is_in 列,该列用于两个条件聚合中,用于计算玩家进出的次数。 (如果你有兴趣,这里解释了 OR NULL 技巧。)
您也可以将 COUNT(condition OR NULL) 条目重写为 SUM(condition)。这肯定会缩短这两个表达式,有些人还发现 SUM 计数方法更清晰/更优雅。无论哪种情况,性能都可能没有差异,因此请选择更适合您口味的方法。
可以在此处找到第二个查询的 SQL Fiddle 演示。