【问题标题】:How can I keep my records grouped together using SQL?如何使用 SQL 将我的记录分组在一起?
【发布时间】:2011-02-24 23:30:52
【问题描述】:

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

match_id、user_id、结果

结果总是以相同的 match_id 成对出现。比如

1837, 4, Win
1837, 29, Forfeit

我想分成两组,一组有结果,另一组没有结果。使用WHERE result <> '' 很容易做到这一点

但是我注意到一些奇怪的记录,如下所示

1839, 5, Win
1839, 40,

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

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

如果两者都有结果 第一组

如果有任何一个结果 第一组

如果没有结果 第二组

使用 MySQL 的完整代码

SQL1: SELECT * from GAME where result <> ''

1837, 4, Win
1837, 29, Forfeit
1839, 5, Win


SQL2: SELECT * from GAME where result = ''

1839, 40,
1850, 30,
1850, 5,

我在找

SQL1: ??

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

SQL2: ??

1850, 30,
1850, 5,

【问题讨论】:

  • 我已经修改了完整的代码

标签: sql


【解决方案1】:

您可以通过两种方式执行此操作,具体取决于您的 DBMS 支持的 SQL。

使用WHERE ... IN

SELECT match_id, user_id, result FROM GAME
WHERE match_id IN (
    SELECT DISTINCT match_id FROM GAME WHERE result <> '' GROUP BY match_id)
GROUP BY match_id

使用派生表:

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

两个语句的思路是一样的,先从有result &lt;&gt; ''的记录中获取match_id,注意DISTINCTGROUP BY的使用,这样你就可以得到对应的记录match_id 有一个非空白结果。

然后获取第一组记录中具有match_id 的所有记录所需的信息,即那些具有match_id 的记录被标识为具有非空白结果。

【讨论】:

    【解决方案2】:

    添加 按 match_id 排序

    到您的查询结束。

    【讨论】:

    • 这不起作用,因为结果 '' 将它们分成不同的类别。我已经在我的原始帖子中添加了伪代码来澄清
    【解决方案3】:

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

    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 <> '')
    

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

    【讨论】:

      【解决方案4】:

      怎么样

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

      ?

      【讨论】:

        【解决方案5】:

        假设您使用的是 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-11
          • 1970-01-01
          • 2020-03-09
          • 2021-06-16
          • 1970-01-01
          • 2014-01-06
          相关资源
          最近更新 更多