草庐IT

关于sql:Mysql count id 出现在2列

codeneng 2023-03-28 原文

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(*):

注意:因此,根据对此答案的评论中的进一步要求,查询包括进出的个人总数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 不会。

  • 我认为这很好用,我有一张有多行的表,我不能一一计算来检查它,但我认为这很好用。有什么方法可以优化查询吗?
  • 您可以在 player_in 和 player_out 上放置单独的索引。除此之外,查询尽可能简单 - 应该可以正常运行。
  • 行!还有一个问题,我怎样才能得到每个玩家的 3 个项目,"ins" "outs" 和 "total"?非常感谢。
  • 这实际上是一个不同的问题,但请参阅奖励编辑的答案以了解如何。
  • 我已经在我的回答中编辑了查询,以按照您的要求返回总数、总输入和总输出。复制粘贴并尝试。
  • 这项工作非常好,谢谢!如果您愿意,请编辑您的答案并在 player_id 后添加一个逗号,这是唯一的错误。再次,谢谢!!
  • 添加了逗号。 (我在 iPhone 上输入了这个……这样的错误可能更难发现)


您可以使用交叉连接到 2 行虚拟表来取消透视 player_* 列,然后对结果进行分组,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
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
;

也就是说,原始表的每一行本质上都是重复的,并且该行的每个副本都提供 player_inplayer_out,具体取决于派生表的 is_in 列是 TRUE 还是 FALSE,形成单个 player 列。这种反透视方法可能比@Bohemian 建议的 UNION 方法执行得更好,因为这种方式(物理)表只传递一次(但您需要测试和比较这两种方法以确定这种方法是否有任何实质性好处您的具体情况)。

要计算进出计数,正如您在对上述答案的评论之一中所要求的那样,您可以像这样扩展我原来的建议:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 技巧。)

您也可以将 COUNT(condition OR NULL) 条目重写为 SUM(condition)。这肯定会缩短这两个表达式,有些人还发现 SUM 计数方法更清晰/更优雅。无论哪种情况,性能都可能没有差异,因此请选择更适合您口味的方法。

可以在此处找到第二个查询的 SQL Fiddle 演示。

有关关于sql:Mysql count id 出现在2列的更多相关文章

  1. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  2. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  3. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  4. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  5. sql - 在 Rails Console for PostgreSQL 的表中显示数据 - 2

    我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有

  6. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

  7. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  8. ruby - 安装 tiny_tds 在 mac os 10.10.5 上出现错误 - 2

    我正在使用macos,我想使用ruby​​驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System

  9. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  10. ruby - 如何让几条 haml 线出现在同一行上? - 2

    我有以下haml:9%strongAskedby:10=link_to@user.full_name,user_path(@user)11.small="(#{@question.created_at.strftime("%B%d,%Y")})"这当前将链接和日期放在不同的行上,当它看起来像“链接(日期)”并且日期的类跨度为小...... 最佳答案 您的代码将生成类似这样的html:Askedby:UsernameApril26,2011当您使用类似.small的东西(即使用点而不指定元素类型)时,haml会创建一个implicit

随机推荐