假设我有一个包含以下字段的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,
答案 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 <> ''
,注意使用DISTINCT
和GROUP 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