我需要挑战当前在现有用户中活跃游戏的玩家。
我正在使用的当前表如下:
Game {
game_id int primary key
player1 varchar(20)
player2 varchar(20)
game_status varchar(10)}
Account{
name varchar(20) primary key
password varchar(15)}
在"游戏"表中,player1和player2都是外国关键:名称。我想要的是选择所有帐户:与当前用户(已登录的用户)在游戏中的名称行(game_stasus ='完成')。当前的用户可以在游戏中:player1或game:player2,这无关紧要。
我想知道您是否可以轻松地使用一个子查询来执行此操作?老实说,我没有想法,希望您能帮助我。
您需要使用嵌套UNION
子句的NOT IN
查询,例如:
SELECT a.name
FROM account a
WHERE a.name NOT IN (
SELECT player1
FROM game WHERE player2 = <current_user> AND game_status = 'active'
UNION
SELECT player2
FROM game WHERE player1 = <current_user> AND game_status = 'active'
)
OR NOT EXISTS (
SELECT * FROM game WHERE player1 = a.name OR player2 = a.name
);
我更喜欢自己使用左JOIN查询,但这主要是风格和历史性的,来自以前的数据库,那里没有较慢。我认为它们对于现代SQL Server实例几乎相同。
SELECT name
FROM Account
LEFT JOIN Game g1
ON g1.Player1 = name
AND player2 = <current_user>
AND game_status = 'active'
LEFT JOIN Game g2
ON g1.Player1 = name
AND player1 = <current_user>
AND game_status = 'active'
WHERE g1.Player1 is null
AND g2.Player2 is null