如何查看与当前用户一起在活动游戏中的所有用户



我需要挑战当前在现有用户中活跃游戏的玩家。

我正在使用的当前表如下:

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

最新更新