我需要挑战当前用户尚未参加活跃游戏的玩家。
我目前使用的表格如下:
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,这无关紧要。
我想知道您是否可以使用存在的子查询轻松完成此操作?老实说,我没有想法,我希望你能帮助我。
答案 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