如何使用SQL将记录组合​​在一起?

时间:2011-02-24 23:30:52

标签: sql

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

match_id,user_id,result

结果总是成对,具有相同的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,

5 个答案:

答案 0 :(得分: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

这两个陈述中的想法是一样的,首先从那些match_id的记录中获取result <> '',注意使用DISTINCTGROUP BY,这样你就将获得match_id具有非空白结果的记录。

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

答案 1 :(得分:0)

添加 ORDER BY match_id

到查询结尾。

答案 2 :(得分:0)

我认为这样的事情适用于你的第一组:

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

但是你应该首先考虑为什么会有这样的无与伦比的记录。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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