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

时间:2016-12-14 23:14:21

标签: mysql sql

我需要挑战当前用户尚未参加活跃游戏的玩家。

我目前使用的表格如下:

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

在" Game" table,player1和player2都是账号的外键:name。我想要的是选择所有帐户:使用当前用户(已登录的用户)尚未完成游戏的名称行(game_stasus ='已完成')。当前用户可能在游戏中:player1或game:player2,这无关紧要。

我想知道您是否可以使用存在的子查询轻松完成此操作?老实说,我没有想法,我希望你能帮助我。

2 个答案:

答案 0 :(得分:0)

您需要使用嵌套NOT IN子句的UNION查询,例如:

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

答案 1 :(得分:0)

我更喜欢自己使用LEFT JOIN查询,但这主要是风格和历史,来自之前的数据库,其中NOT IN明显变慢。我认为它们对于现代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