Mysql 将多个值与where子句中的子查询结果进行比较

Mysql 将多个值与where子句中的子查询结果进行比较,mysql,sql,database,postgresql,Mysql,Sql,Database,Postgresql,我有两个相关的表格如下: 使用者 用户id 用户操作 用户\u操作\u id 用户id 用户操作 每当用户执行操作时,useractions表中都会有一个新的插入。我需要一个查询来获取那些USERACTION行,其中用户只执行了一组特定的操作,比如1,2,而不是3,4。 所以我有一个类似的问题- select * from USERACTIONS where (1,2) in(select user_action from USERACTIONS where user_id=100) and u

我有两个相关的表格如下:

使用者

用户id

用户操作

用户\u操作\u id

用户id

用户操作

每当用户执行操作时,useractions表中都会有一个新的插入。我需要一个查询来获取那些USERACTION行,其中用户只执行了一组特定的操作,比如1,2,而不是3,4。 所以我有一个类似的问题-

select * from USERACTIONS where (1,2) in(select user_action from USERACTIONS where user_id=100) and user_id=100; 
问题是上面的查询不起作用,因为提供1,2期望子查询也返回两列,这是可以理解的。这就是我得到的错误-

错误:子查询的列太少

给出一个值,比如说1或2,效果很好。我想知道是否有任何方法可以使用同一查询并将子查询的结果与多个值进行比较?我更喜欢相同的查询,因为这里演示的案例只是大型查询的一部分

请注意,查询不应列出执行1,2,3,4操作的用户,应列出仅执行1,2操作的用户,并且用户操作值可以是任意随机整数

欢迎任何其他查询,但希望在同一查询中进行更改。提前感谢。

试试这个:

SELECT USERS.user_id, USERACTIONS.user_action
FROM USERACTIONS
LEFT JOIN USERS ON USERS.user_id = USERACTIONS.user_id  where USERACTIONS.user_action in (1,2);
试试这个:

SELECT USERS.user_id, USERACTIONS.user_action
FROM USERACTIONS
LEFT JOIN USERS ON USERS.user_id = USERACTIONS.user_id  where USERACTIONS.user_action in (1,2);

这适用于您的查询

将数字添加到in子句中

SELECT a.user_id
FROM
(SELECT DISTINCT user_id 
from 
 USERACTIONS 
 WHERE user_action 
               IN (1,2)) a 
INNER JOIN
(SELECT DISTINCT user_id 
from 
 USERACTIONS 
 WHERE user_action 
              NOT  IN (1,2)) b 
ON a.user_id <> b.user_id                  
; 

dbfiddle

这适用于您的查询

将数字添加到in子句中

SELECT a.user_id
FROM
(SELECT DISTINCT user_id 
from 
 USERACTIONS 
 WHERE user_action 
               IN (1,2)) a 
INNER JOIN
(SELECT DISTINCT user_id 
from 
 USERACTIONS 
 WHERE user_action 
              NOT  IN (1,2)) b 
ON a.user_id <> b.user_id                  
; 

dbfiddle

外部查询中有两个where子句。这是一个语法错误。外部查询中有一个where子句,内部查询中有一个where子句。你的问题有三个方面。我的错。现在编辑。感谢您指出:在外部查询中有两个where子句。这是一个语法错误。外部查询中有一个where子句,内部查询中有一个where子句。你的问题有三个方面。我的错。现在编辑。感谢您指出:您可以在where子句中添加`and USERACTIONS.user_id=100`以筛选此用户。正如我特别提到的,我希望查询返回USERACTIONS,其中用户只执行了1,2,而不是1,2,3,4。你的查询也会返回那些执行了1,2,3,4的用户。我不知道你的数据,但是where子句可能是:USERACTIONS.user\u action\u id在1,2中还提到,我的user\u action\u id可以是随机整数值:你可以在where子句中添加`and USERACTIONS.user\u id=100`来筛选我特别提到的这个用户,我希望查询返回用户仅执行1,2而不是1,2,3,4的useractions。你的查询也会返回那些执行了1,2,3,4的人。我不知道你的数据,但是where子句可能是:USERACTIONS.user\u action\u id in 1,2还提到我的user\u action\u id可以是随机整数值:这很有效,但在我的原始数据中,我已经有很多子查询/联接,我不想让它变得更复杂。这就是为什么我更喜欢上面提到的查询,可能需要调整,也可能需要一个连接/子查询较少的查询。我将投票支持你的答案,但不接受它作为最终答案。不过谢谢你的建议您可以尝试使用带有参数的视图,但随着必要性的增加,查询将稳步增长。这是可行的,但在我的原始数据中,我已经有很多子查询/连接,我不想让它变得更复杂。这就是为什么我更喜欢上面提到的查询,可能需要调整,也可能需要一个连接/子查询较少的查询。我将投票支持你的答案,但不接受它作为最终答案。不过谢谢你的建议您可以尝试带有参数的视图,但随着必要性的增加,查询将稳步增长
SELECT a.user_id
FROM
(SELECT DISTINCT user_id 
from 
 USERACTIONS 
 WHERE user_action 
               IN (1,2)) a 
INNER JOIN
(SELECT DISTINCT user_id 
from 
 USERACTIONS 
 WHERE user_action 
              NOT  IN (1,2)) b 
ON a.user_id <> b.user_id
               
; 
| user_id | | ------: | | 101 |