MySQL查询多列distinct加上辅助列条件

MySQL查询多列distinct加上辅助列条件,mysql,sql,inner-join,distinct,Mysql,Sql,Inner Join,Distinct,想象一下,一张平板桌上记录着游戏比赛,每场比赛有三名参与者:一名攻击者、一名防御者和一名押注于玩家1和玩家2之间战斗结果的投注者。该表包括每场比赛的球员和投注者的姓名,以及比赛日期、每位球员的得分、比赛地点和裁判的姓名。我在下面包含了一些示例数据的createsql DROP TABLE IF EXISTS `game`; CREATE TABLE `game` ( `game_date` text, `player_1` text, `player_2` text, `bet

想象一下,一张平板桌上记录着游戏比赛,每场比赛有三名参与者:一名攻击者、一名防御者和一名押注于玩家1和玩家2之间战斗结果的投注者。该表包括每场比赛的球员和投注者的姓名,以及比赛日期、每位球员的得分、比赛地点和裁判的姓名。我在下面包含了一些示例数据的createsql

DROP TABLE IF EXISTS `game`;

CREATE TABLE `game` (
  `game_date` text,
  `player_1` text,
  `player_2` text,
  `bettor` text,
  `p1_score` double DEFAULT NULL,
  `p2_score` double DEFAULT NULL,
  `result` double DEFAULT NULL,
  `venue` text,
  `referee` text
) 

INSERT INTO `game` VALUES ('2020-04-05','Bob','Kelly','Kevin',100,78,0.2,'TS1','Richard'),('2020-03-06','Jim','Bob','Dave',100,97,1.2,'TS2','Mike'),('2020-02-05','Jim','Bob','Kevin',100,86,0.9,'TS2','Mike'),('2020-01-06','Kelly','Bob','Jim',100,92,1.3,'TS2','Richard'),('2019-12-07','Kelly','Bob','Jim',100,98,1.7,'TS1','Mike'),('2019-11-07','Kelly','Bob','Kevin',78,100,2.1,'TS2','Mike'),('2019-10-08','Kelly','Bob','Kevin',97,100,1.5,'TS1','Mike'),('2019-09-08','Kelly','Jim','Dave',86,100,2.4,'TS1','Richard'),('2019-08-09','Kelly','Jim','Dave',92,100,2.8,'TS2','Mike'),('2019-07-10','Kelly','Jim','Dave',98,100,2.2,'TS2','Mike'),('2019-06-10','Kelly','Jim','Dave',100,78,1.9,'TS2','Richard'),('2019-05-11','Sarah','Jim','Kevin',100,97,2.1,'TS1','Mike'),('2019-04-11','Sarah','Jim','Kevin',100,86,2.1,'TS2','Mike'),('2019-03-12','Sarah','Jim','Kevin',100,92,2.8,'TS1','Mike'),('2019-02-10','Sarah','Jim','Kevin',100,98,1.8,'TS1','Richard');
我需要一个查询,返回匹配参与者的每个唯一集合的匹配信息。。。但仅限于三名参赛者共同参加的第一场比赛,即三人参加的比赛中最早的比赛日期

例如,一场比赛,鲍勃是第一名球员,凯利是第二名球员,凯文是下注者,这将构成一个独特的三人组。在数据中,这三个人只有一个这样的配对,因此查询将为这一个匹配返回一行

在Sarah作为玩家1,Jim作为玩家2,Kevin作为投注者的情况下,这三人组有四场比赛,因此查询将只返回最早比赛的信息,即2019年2月10日的比赛

请注意,在示例数据中,有两个匹配项与三个字母“Kelly”、“Bob”、“Jim”匹配。还有另外两场比赛,分别是凯利、吉姆和鲍勃。这是不一样的,因为鲍勃和吉姆交换位置的是玩家2和赌徒。因此,查询将为每一行返回一行,即分别为'12/072019'和'08/09/2019'的匹配

使用DISTINCT,我可以返回所有唯一玩家分组的列表

SELECT DISTINCT player_1, player_2, bettor FROM games;
使用GROUP BY,我可以返回该组参与的所有比赛的所有游戏信息

SELECT * FROM games GROUP BY player_1, player_2, bettor;
但我不知道如何返回所有的游戏信息,只针对最早的一个游戏,在这个游戏中,三个参与者一起玩,并且在游戏中扮演不同的角色

我曾经尝试过使用MIN()对game_date进行子查询,但结果是失败的。我怀疑可能有一个内部连接解决方案,但我还没有找到它


我非常感谢您提供的任何指导。

一种规范方法使用子查询的连接,该子查询为每个三人组识别最早的游戏:

SELECT g1.*
FROM games g1
INNER JOIN
(
    SELECT player_1_name, player_2_name, player_3_name,
           MIN(game_date) AS min_game_date
    FROM games
    GROUP BY player_1_name, player_2_name, player_3_name
) g2
    ON g2.player_1_name = g1.player_1_name AND
       g2.player_2_name = g1.player_2_name AND
       g2.player_3_name = g1.player_3_name AND
       g2.min_game_date = g1.game_date;
如果您正在运行MySQL 8+,那么
行数
分析函数提供了另一个选项:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY player_1_name, player_2_name,
                                              player_3_name
                                 ORDER BY game_date) rn
    FROM games
)

SELECT *
FROM cte
WHERE rn = 1;

样本数据和期望的结果将非常有用。如果玩家1/2/3玩一个游戏,3/1/2玩另一个游戏,那是“相同”的玩家吗?谢谢,@GordonLinoff,这是一个非常好和重要的问题,我没有澄清。我将对问题进行编辑以说明这一点。简言之,是的,每个玩家作为玩家1、玩家2或玩家3的位置都很重要。想象一下,玩家1被认为是攻击者,玩家2被认为是防御者,玩家3是打赌攻击者和防御者之间结果的赌徒。你的MySql版本是什么?@forpas--MySql版本:8.0.11谢谢,@tim biegeleisen!这真的很有趣。当我运行查询时,我得到了整个表的笛卡尔积,其中查询为每个唯一的三个部分返回的行数等于匹配数乘以表中记录总数。有游戏记录,因此结果集超过2000000行。顺便说一句,MySQL Workbench在查询时发出吠声,因为基本查询中不包括g1.game_date,并且比较g2.min_game_date=g1.game_date;失败。所以我在第一个加入查询中添加了game_date。用示例数据设置一个演示,并将链接粘贴到这里。使用dbfiddle.uk.co作为演示站点。问题中有示例数据。Tim,我很遗憾我在第一次发布问题时没有这样做。但是,正如@barmar所提到的,我已经在问题中添加了样本数据。如果每个玩家的位置都很重要,即
(1,2,3)
(1,3,2)
不同,那么我的答案应该已经适用于你了。