2011-02-24 23 views
1

假设我有以下字段的游戏桌如何使用SQL将我的记录分组在一起?

match_id,USER_ID,导致

总是在相同的match_id对的结果。所以例如

1837, 4, Win 
1837, 29, Forfeit 

我想分成两组,一组有结果,一组没有。这是非常容易使用WHERE result <> ''

做不过我注意到几个怪记录,如下面的

1839, 5, Win 
1839, 40, 

第二记录没有记录反对的结果。因此,使用​​将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, 
+0

我使用完整的代码修改了 – deltanovember 2011-02-24 23:46:20

+0

谢谢。 DBMS? – 2011-02-24 23:54:42

回答

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,请注意使用的DISTINCTGROUP BY,这样您将获得match_id有非空白结果的记录。

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

0

BY match_id

添加 为了在您的查询的末尾。

+0

这不起作用,因为结果<>“'将它们分成不同的类别。我已将伪代码添加到我的原始帖子中进行说明 – deltanovember 2011-02-24 23:39:37

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

但你或许应该看看为什么有不匹配的记录一样,在第一个地方。

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 
0

什么

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

相关问题