我是SQL的新手,所以这可能非常简单,但是,我无法找到解决方案。
基本上我的查询如下:
SELECT UserID
FROM Users
NOT UNION
SELECT UserID
FROM User_Groups
WHERE GroupID = '$_[0]'
但是,我不确定从另一个查询中排除一个查询的语法是什么。 我想说的是给我所有用户ID的除以外的X组。
答案 0 :(得分:4)
SELECT UserID FROM Users
WHERE UserID NOT IN (SELECT UserID FROM User_Groups WHERE GroupID = ?)
P.S。不要将变量插入到查询中,因为这会导致代码中的SQL注入漏洞。改为使用占位符。
答案 1 :(得分:2)
SELECT Users.UserID
FROM Users
LEFT JOIN User_Groups ON Users.UserID = User_Groups.UserID
WHERE Users.GroupID = '$_[0]'
AND User_Groups.UserID IS NULL
你可以将join连接到另一个表,然后对你在WHERE子句中的另一个表进行IS NULL检查,如我所示。
答案 2 :(得分:2)
您也可以使用EXCEPT
:
SELECT UserID
FROM Users
EXCEPT
SELECT UserID
FROM User_Groups
WHERE GroupID = '$_[0]'
EXCEPT
是SQL的set减法版本。您应该使用的各种方法(EXCEPT
,NOT IN
,...)通常取决于您的具体情况,数据库支持的内容以及哪种方法最适合您。
eugene y已经提到了你的代码的SQL注入问题,所以我只考虑覆盖。
我链接到PostgreSQL文档,即使这不是PostgreSQL问题,因为PostgreSQL文档非常好。 SQLite支持EXCEPT
:
EXCEPT运算符返回左SELECT返回的行的子集,这些行也不是由右侧SELECT返回的。在返回结果集之前,将从INTERSECT和EXCEPT运算符的结果中删除重复的行。
答案 3 :(得分:1)
NOT IN() - 否定IN()
SELECT UserID FROM User_Groups WHERE GroupID NOT IN('1','2')
IN()参数也可以是子查询。
答案 4 :(得分:0)
您是否正在寻找与postgres或mySQL数据库一起使用的解决方案? 或者您正在寻找一个简单的SQL解决方案吗?
使用postgres,带有“WHERE NOT EXISTS”的子查询可能会起作用:
SELECT * FROM (SELECT * FROM SCHEMA_NAME.TABLE_NAME) 哪里 (不是EXISTS(SELECT * FROM SCHEMA_NAME.TABLE_NAME)