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