我是SQL新手,所以这可能非常简单,但是,我无法找到解决方案。如何排除或否定两个查询?
基本上我的查询如下:
SELECT UserID
FROM Users
NOT UNION
SELECT UserID
FROM User_Groups
WHERE GroupID = '$_[0]'
但是,我不知道语法是排除来自另一个查询什么。 什么,我想说的是,给我所有的用户ID的除了对于那些在X组
我是SQL新手,所以这可能非常简单,但是,我无法找到解决方案。如何排除或否定两个查询?
基本上我的查询如下:
SELECT UserID
FROM Users
NOT UNION
SELECT UserID
FROM User_Groups
WHERE GroupID = '$_[0]'
但是,我不知道语法是排除来自另一个查询什么。 什么,我想说的是,给我所有的用户ID的除了对于那些在X组
SELECT UserID FROM Users
WHERE UserID NOT IN (SELECT UserID FROM User_Groups WHERE GroupID = ?)
P.S.不要将变量插入到查询中,因为这可能会导致代码中的SQL注入漏洞。改用占位符。
NOT IN() - ()否定IN
SELECT UserID FROM User_Groups WHERE GroupID NOT IN('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
你可以离开加入到其他表,然后把一个已经在另一个表中的NULL检查在哪里,因为我已经证明子句。
您是否在寻找与postgres或mySQL数据库一起使用的解决方案? 或者你正在寻找一个普通的SQL解决方案?
在Postgres使用子查询 “WHERE NOT EXISTS” 可能的工作,如:
SELECT * FROM (SELECT * FROM SCHEMA_NAME.TABLE_NAME) WHERE (NOT EXISTS(SELECT * FROM SCHEMA_NAME.TABLE_NAME)
你可以使用EXCEPT
还有:
SELECT UserID
FROM Users
EXCEPT
SELECT UserID
FROM User_Groups
WHERE GroupID = '$_[0]'
EXCEPT
是SQL的版本设置减法其中各种Appro公司的。疼痛(EXCEPT
,NOT IN
,...)你应该像往常一样依赖于你的具体情况,你的数据库支持什么,以及哪一个最适合你。
而且eugene y已经提到了你的代码中的SQL注入问题,所以我只考虑这个问题。
我链接到PostgreSQL文档,即使这不是PostgreSQL问题,因为PostgreSQL文档是相当不错的。 SQLite支持EXCEPT
:
EXCEPT运算符返回由左侧SELECT返回的行的子集,这些行也不是右侧SELECT返回的。在返回结果集之前,INTERSECT和EXCEPT运算符的结果中将删除重复的行。