【问题标题】:Why do I get wrong count of same values in two SQL table columns?为什么我在两个 SQL 表列中的相同值计数错误?
【发布时间】:2021-06-29 12:10:54
【问题描述】:

我有一张包含游戏结果的表格。两列用于玩家姓名。玩家的名字可以出现在这两列中。在计算某个特定玩家的决斗频率时,我得到了错误的决斗计数。这是一个简化的描述,以保持对问题的关注。

这是我的表结果到目前为止发生的决斗:

player1 player2
Alice Bob
Christine Daniel
Daniel Christine
Christine Daniel
Esme Franz
Esme Daniel
Garrey Hans
Hans Garrey

我想得到的是,同一个名字出现在两列中的频率。请注意,Garrey 和 Hans 的决斗次数正确为 2:

player duels
Daniel 4
Christine 3
Esme 2
Garrey 2
Hans 2
Franz 1
Alice 1
Bob 1

我的真实表和 SQL 语句计算其他统计数据更复杂,所以我需要两个 SELECT 结合一个 UNION,就像我在这个例子中使用的一样:

SELECT 
  playerName AS playerName, 
  SUM(duels) AS duels 
  FROM ( 
    SELECT player1 AS playerName, 
    COUNT(player1) AS duels
    FROM results 
    GROUP BY player1 
    UNION 
    SELECT player2 AS playerName, 
    COUNT(player2) AS duels 
    FROM results 
    GROUP BY player2 
  ) AS A 
  GROUP BY playerName 
  ORDER BY duels DESC

现在的问题是,我弄错了 Garrey 和 Hans 的决斗次数 - 1 而不是 2:

player duels
Garrey 1
Hans 1

如果我将 Garrey 和 Hans 的更多结果添加到我的表中,那么我的 SQL 语句将正确返回 3 的决斗计数。

这是fiddle

我在这里做错了什么?据我了解,我试图在第一列中计算名称,然后在第二列中,然后将两个计数相加。我按照here 的建议尝试了另一种方法,使用 Count(*),但这导致所有结果都错误。

如有任何反馈,非常感谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    反透视和聚合。您可以为此使用union all

    select player, count(*)
    from ((select player1 as player from results) union all
          (select player2 from results)
         ) p
    group by player
    order by count(*) desc;
    

    【讨论】:

    • 嗯,不幸的是,这仅适用于我上面的简化示例,但打破了我的真实案例的其余部分。而且我仍然想知道,为什么我上面的 SQL 语句不适用于 Garrey 和 Hans,而是适用于其他人。
    • @Ravelli 我们只能回答被问到的问题;所以您需要编辑您的问题并在查询:-) 中显示其他情况
    • @Ravelli 。 . .这回答了您在这里提出的问题。如果您有不同的问题,请提出一个 问题,并附上适当的解释、示例数据和期望的结果。无效的答案是不礼貌的。
    • @Ravelli 对不起,我误解了。 -- 你说this works in my simplified example above only, but breaks up the rest of my real case. And I still wonder,,所以你暗示这里的答案在你的真实查询中不起作用,但是这里没有人能够告诉你为什么它在你的真实查询中不起作用,直到你向我们展示了查询,这就是我的意思。无论如何,别担心,:-)
    • @Martin 不过,我的问题仅涉及我在上面发布的简化 SQL 语句。我从来没有要求我真正的。为我提供替代方式并不能回答我的问题 - 问题在标题中,在 URL 中,我在每条评论中都重复了它。它以“为什么”开头,而不是“如何”。
    【解决方案2】:

    试试这个

    SELECT player1, COUNT(player1)duels
    FROM(
    select player1 from results
    UNION ALL
    select player2 from results)t group by player1
    order by COUNT(player1) desc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2014-11-29
      • 2020-09-22
      相关资源
      最近更新 更多