MYSQL-如何返回两列的唯一计数

MYSQL-如何返回两列的唯一计数,mysql,sql,database,Mysql,Sql,Database,我试图解决这个问题,我有两个玩家有比赛分数。查询应返回一张包含游戏次数的玩家图表,如果得分为3:0或0:3,则得分为3的玩家将获得3分,否则任何胜利都将获得2分 我的桌子: player1 player2 player1score player2score ------- ------- ------------- ------------ john lee 3 0

我试图解决这个问题,我有两个玩家有比赛分数。查询应返回一张包含游戏次数的玩家图表,如果得分为3:0或0:3,则得分为3的玩家将获得3分,否则任何胜利都将获得2分

我的桌子:

    player1        player2   player1score  player2score
    -------        -------   -------------  ------------
    john            lee           3             0 
    maria           andy          1             3
    andy            john          1             3
所需表格应如下所示:

    players        gamesplayed   points  
    -------        -----------   ------
    john            2               5 
    andy            2               2
    maria           1               0
    lee             1               0
我有一个疑问:

SELECT DISTINCT players, count(*) gamesplayed
FROM (
    SELECT player1 AS players
    FROM table
    UNION
    SELECT player2 AS players
    FROM table
) players
但是上面的查询返回的是
gamesplayed
中所有玩家的总数,而不是单个玩家的总数

有人看到问题了吗?我也不确定是否执行


非常感谢

部分困难在于您使用的是
联合
,它将获得不同的值-因此,如果一个玩家以玩家1的身份玩一场游戏,而另一个玩家以玩家2的身份玩另一场游戏,他将只被计算一次。此外,如果他作为球员1打了两场比赛,他只会被计算一次

我认为您需要以下内容:

SELECT p1.player, COUNT(*) AS games_played, SUM(p1.player_score) AS total_points
  FROM (
    SELECT player1 AS player, player1score AS player_score
      FROM mytable
     UNION ALL
    SELECT player2 AS player, player2score AS player_score
      FROM mytable
) p1
 GROUP BY p1.player;

UNION ALL
将保留所有行,而不是像
UNION
那样只获取不同的行。

部分困难在于您使用的
UNION
将获得不同的值-因此,如果一个玩家以玩家1的身份玩一个游戏,而另一个玩家以玩家2的身份玩另一个游戏,他将只被计算一次。此外,如果他作为球员1打了两场比赛,他只会被计算一次

我认为您需要以下内容:

SELECT p1.player, COUNT(*) AS games_played, SUM(p1.player_score) AS total_points
  FROM (
    SELECT player1 AS player, player1score AS player_score
      FROM mytable
     UNION ALL
    SELECT player2 AS player, player2score AS player_score
      FROM mytable
) p1
 GROUP BY p1.player;

UNION ALL
将保留所有行,而不是像
UNION
那样只获取不同的行。

在SQL Server中完成,不知道它是否与MySql一起工作:

WITH playerSel AS(
    SELECT player1 AS player, 
        CASE 
            WHEN player1score - player2score > 2 THEN  + 3
            WHEN player1score - player2score > 0 THEN +2
            ELSE + 0
            END as score 
        FROM playerTable
    UNION ALL
    SELECT player2 AS player, 
        CASE 
        WHEN player2score - player1score > 2 THEN  + 3
        WHEN player2score - player1score > 0 THEN +2
        ELSE + 0
        END as score
    FROM playerTable)
SELECT player, 
    COUNT(player) AS gamesPlayed, SUM(score) score
FROM playerSel
Group by player;
我检索到以下信息:

安迪;2.2. 厕所;2.5. 李;1.0
玛丽亚;1.0

在SQL Server中完成,不知道它是否与MySql一起工作:

WITH playerSel AS(
    SELECT player1 AS player, 
        CASE 
            WHEN player1score - player2score > 2 THEN  + 3
            WHEN player1score - player2score > 0 THEN +2
            ELSE + 0
            END as score 
        FROM playerTable
    UNION ALL
    SELECT player2 AS player, 
        CASE 
        WHEN player2score - player1score > 2 THEN  + 3
        WHEN player2score - player1score > 0 THEN +2
        ELSE + 0
        END as score
    FROM playerTable)
SELECT player, 
    COUNT(player) AS gamesPlayed, SUM(score) score
FROM playerSel
Group by player;
我检索到以下信息:

安迪;2.2. 厕所;2.5. 李;1.0
玛丽亚;1.0

现在我认为适合的MySQL语句,只需将其更改为内联视图,没有MySQL环境,如果语法不完全正确,请原谅:

SELECT player, 
    COUNT(player) AS gamesPlayed, SUM(score) score
FROM 
    (SELECT player1 AS player, 
        CASE 
            WHEN player1score - player2score > 2 THEN  + 3
            WHEN player1score - player2score > 0 THEN +2
            ELSE + 0
            END as score 
        FROM playerTable
    UNION ALL
    SELECT player2 AS player, 
        CASE 
        WHEN player2score - player1score > 2 THEN  + 3
        WHEN player2score - player1score > 0 THEN +2
        ELSE + 0
        END AS score
    FROM playerTable) 
    AS playerSel
Group by player;

现在我认为适合的MySQL语句,只需将其更改为内联视图,没有MySQL环境,如果语法不完全正确,请原谅:

SELECT player, 
    COUNT(player) AS gamesPlayed, SUM(score) score
FROM 
    (SELECT player1 AS player, 
        CASE 
            WHEN player1score - player2score > 2 THEN  + 3
            WHEN player1score - player2score > 0 THEN +2
            ELSE + 0
            END as score 
        FROM playerTable
    UNION ALL
    SELECT player2 AS player, 
        CASE 
        WHEN player2score - player1score > 2 THEN  + 3
        WHEN player2score - player1score > 0 THEN +2
        ELSE + 0
        END AS score
    FROM playerTable) 
    AS playerSel
Group by player;


感谢您的回复,但是您的解决方案给了我一个错误“每个派生表都必须有自己的别名”,然后我通过在查询的末尾添加
作为player order by player
来解决这个问题,但这只返回一行,并将所有内容一起计算:(很抱歉,我忘记了您需要MySQL中的别名来进行子查询。请等待,进行编辑。感谢您的回复,但是您的解决方案给了我一个错误“每个派生表都必须有自己的别名”然后,我在查询结束时添加
作为播放器顺序来修复此问题,但只返回一行,并将所有内容一起计数:(很抱歉,我忘了在MySQL中需要一个别名来进行子查询。准备,编辑。我使用with可能会有点奇怪,但我不知道如何正确分组,因为我需要根据使用的AGG函数进行分组。您的查询似乎非常正确,但是MySQL不支持
with
子句…所以我被卡住了再次:(我为什么使用with可能会很奇怪,但我不知道如何正确分组,因为我需要根据使用的AGG函数进行分组。您的查询似乎非常正确,但是MYSQL不支持
with
子句…所以我再次陷入困境:(Briliiant!非常感谢:)您可以使用SQL FIDLE在您手头没有环境的情况下测试查询-我认为您不需要在
CASE
语句中使用
+
符号,
COUNT(*)
是比
COUNT(player)更好的选择
IMHO。谢谢你的提示。当我尝试使用它时,fiddle停止了。我不知道,但我刚刚开始总是在计数中使用一列,我认为它可能更快。是的,+不是必需的thxbriliant!非常感谢:)您可以使用SQL FIDLE在您手头没有环境的情况下测试查询-我认为您不需要在
CASE
语句中使用
+
符号,
COUNT(*)
是比
COUNT(player)更好的选择
IMHO。谢谢你的提示。我尝试使用itI时,fiddle出现故障,我不知道,但我刚刚开始总是在计数中使用一列,我认为它可能更快。是的,不需要+thx