如何使用SQL将记录分组?

如何使用SQL将记录分组?,sql,Sql,假设我有一个包含以下字段的游戏表 匹配id、用户id、结果 结果总是成对出现,具有相同的匹配id 1837, 4, Win 1837, 29, Forfeit 我想分为两组,一组有结果,一组没有。使用WHERE result很容易做到这一点 然而,我注意到一些奇怪的记录,例如 1839, 5, Win 1839, 40, 第二条记录没有针对其记录的结果。因此,使用结果将拆分匹配1839分为两个单独的组,而我希望它们保持在一起。我可以用SQL实现这一点吗 所以基本上我的伪代码是: 如果两者都有

假设我有一个包含以下字段的游戏表

匹配id、用户id、结果

结果总是成对出现,具有相同的匹配id

1837, 4, Win
1837, 29, Forfeit
我想分为两组,一组有结果,一组没有。使用WHERE result很容易做到这一点

然而,我注意到一些奇怪的记录,例如

1839, 5, Win
1839, 40,
第二条记录没有针对其记录的结果。因此,使用结果将拆分匹配1839分为两个单独的组,而我希望它们保持在一起。我可以用SQL实现这一点吗

所以基本上我的伪代码是:

如果两者都有结果 第一组

如果其中一个有结果 第一组

如果没有结果 第二组

使用MySQL的完整代码

SQL1: SELECT * from GAME where result <> ''
我在找

SQL1:

1837, 4, Win
1837, 29, Forfeit
1839, 5, Win
1839, 40,
SQL2:

1850, 30,
1850, 5,
加 按匹配id排序

添加到查询的末尾。

添加 按匹配id排序


在您的查询结束时。

我认为这样的方法对您的第一组人适用:

SELECT match_id,user_id,result
FROM GAME G
WHERE
EXISTS (SELECT 1 FROM GAME WHERE match_id=G.match_id and result <> '')
第二组:

SELECT match_id,user_id,result
FROM GAME G
WHERE
NOT EXISTS (SELECT 1 FROM GAME WHERE match_id=G.match_id and result <> '')

但是你可能应该首先研究一下为什么会有这样不匹配的记录。

我认为这样的东西对你的第一组人会有用:

SELECT match_id,user_id,result
FROM GAME G
WHERE
EXISTS (SELECT 1 FROM GAME WHERE match_id=G.match_id and result <> '')
第二组:

SELECT match_id,user_id,result
FROM GAME G
WHERE
NOT EXISTS (SELECT 1 FROM GAME WHERE match_id=G.match_id and result <> '')

但您可能首先应该了解为什么会有这样的不匹配记录。

假设您使用的是SQL Server 2005或更新版本:

请尝试为您的SQL1执行以下操作:

with nonEmptyGames as
(
    SELECT match_id
    FROM Game
    GROUP BY Match_id
    having MAX(Result) != ''
)
SELECT * FROM Games as g
INNER JOIN nonEmptyGames  as neg
ON g.match_id = neg.match_id
对于SQL2,这是:

with nonEmptyGames as
(
    SELECT match_id
    FROM Game
    GROUP BY Match_id
    having MAX(Result) != ''
)
SELECT * FROM Games as g
LEFT JOIN nonEmptyGames  as neg
ON g.match_id = neg.match_id
WHERE neg.match_id is null

假设您使用的是SQL Server 2005或更新版本:

请尝试为您的SQL1执行以下操作:

with nonEmptyGames as
(
    SELECT match_id
    FROM Game
    GROUP BY Match_id
    having MAX(Result) != ''
)
SELECT * FROM Games as g
INNER JOIN nonEmptyGames  as neg
ON g.match_id = neg.match_id
对于SQL2,这是:

with nonEmptyGames as
(
    SELECT match_id
    FROM Game
    GROUP BY Match_id
    having MAX(Result) != ''
)
SELECT * FROM Games as g
LEFT JOIN nonEmptyGames  as neg
ON g.match_id = neg.match_id
WHERE neg.match_id is null
那怎么办

SELECT * FROM ( SELECT * from GAME where result <> '' ) as x ORDER BY x.match_id

怎么样

SELECT * FROM ( SELECT * from GAME where result <> '' ) as x ORDER BY x.match_id

根据您的DBMS支持的SQL,您可以通过两种方式来执行此操作

使用WHERE。。。在:

使用派生表:

SELECT g.match_id, g.user_id, g.result
FROM GAME AS g INNER JOIN (
    SELECT DISTINCT match_id FROM GAME WHERE result <> ''  GROUP BY match_id
) AS m ON g.match_id = m.match_id
GROUP BY match_id
这两个语句的思想是相同的,首先从那些有结果的记录中获取匹配id,注意使用DISTINCT和GROUP BY,这样您将获得匹配id具有非空结果的记录


然后获取第一组记录中具有匹配id的所有记录所需的信息,即具有识别为具有非空结果的匹配id的记录。

根据DBMS支持的SQL,您可以通过两种方式执行此操作

使用WHERE。。。在:

使用派生表:

SELECT g.match_id, g.user_id, g.result
FROM GAME AS g INNER JOIN (
    SELECT DISTINCT match_id FROM GAME WHERE result <> ''  GROUP BY match_id
) AS m ON g.match_id = m.match_id
GROUP BY match_id
这两个语句的思想是相同的,首先从那些有结果的记录中获取匹配id,注意使用DISTINCT和GROUP BY,这样您将获得匹配id具有非空结果的记录


然后获取第一组记录中具有匹配id的所有记录所需的信息,即那些具有识别为具有非空结果的匹配id的记录。

这不起作用,因为结果将它们划分为不同的类别。我在我的原始帖子中添加了伪代码,以澄清这不起作用,因为结果将它们分成了不同的类别。我已经在我的原始帖子中添加了伪代码来澄清我已经用完整的代码修改了我已经用完整的代码修改了