几个基本的SQL查询问题

几个基本的SQL查询问题,sql,Sql,基本上我有一个小事件系统,但我有一些奇怪的SQL查询问题。第一,我需要找到所有报名参加所有3项活动的人的名字。 我试着做: SELECT name FROM users NATURAL JOIN events WHERE events.id = '4' AND events.id = '7' AND events.id = '8' 但是它返回零行,即使有用户已经注册了所有3个事件 第二个,我需要找到一个报名参加第四次活动但不参加第七次活动的人 我试过: 它返回的结果与不使用!=标记,因为

基本上我有一个小事件系统,但我有一些奇怪的SQL查询问题。第一,我需要找到所有报名参加所有3项活动的人的名字。 我试着做:

SELECT name 
FROM users 
NATURAL JOIN events 
WHERE events.id = '4' AND events.id = '7' AND events.id = '8'
但是它返回零行,即使有用户已经注册了所有3个事件

第二个,我需要找到一个报名参加第四次活动但不参加第七次活动的人 我试过:

它返回的结果与不使用!=标记,因为它至少应该消除一些结果


提前感谢。

首先,events.id不可能同时等于4、7和8(我想您正在这里寻找OR运算符)。第二个问题是,您不能同时将同一列与4和7进行比较-它将查找4和7不同的内容(这4肯定是我上次检查的内容)。

如前所述,
events.id
只能保存一个值;如果要查找多个值,请使用
。此外,由于它只能是一个值,因此它将自动不等于其他所有值。您是否打算使用
事件的第二个副本进行联接并签入另一个副本?

您正在尝试匹配结果集中的多行。为此,需要通过多次加入“事件”表将这些行上卷到一行中。例如:

SELECT name 
FROM users INNER JOIN events AS e4 
    INNER JOIN events AS e7 
    INNER JOIN events AS e8
WHERE e4.id = '4' 
  AND e7.id = '7' 
  AND e8.id = '8'

关于第一个问题,这个怎么样

Select name 
from users u1
where exists
(select name
 from users
 where users.name = u1.name
 and events.id = 4
)
and exists
(select name
 from users
 where users.name = u1.name
 and events.id = 7
)
and exists
(select name
 from users
 where users.name = u1.name
 and events.id = 8
)
第二项问题

Select name 
from users u1
where exists
(select name
 from users
 where users.name = u1.name
 and events.id = 4
)
and not exists
(select name
 from users
 where users.name = u1.name
 and events.id = 7
)
从未使用过自然连接(在SQL Server中不可用),我觉得您的结构有点奇怪,但请尝试:

SELECT name 
FROM users 
NATURAL JOIN events 
WHERE events.id = '4' OR events.id = '7' OR events.id = '8'  
GROUP BY name
HAVING count(*) =3

但是您真的在events表中存储了不同的userid(您没有使用id的名称,是吗?)?您应该有一个与事件表相关的事件参与者表,并且事件表应该只描述特定事件,而不是多人参与。

与其尝试使用自然联接,不如约束联接

是否每个用户都有多个事件,因此event.userId是event.id的外键?如果 所以,试试看


欢迎来到Stackoverflow。您能否编辑您的问题以提供这两个表的描述/模式?这看起来是正确的想法,尽管必须在子查询中重复连接
SELECT name 
FROM users 
NATURAL JOIN events 
WHERE events.id = '4' OR events.id = '7' OR events.id = '8'  
GROUP BY name
HAVING count(*) =3
Select name
from users u1
where users.id in
   (Select userId 
    from events
    where events.id=4) and
 users.id in
   (Select userId 
    from events
    where events.id=7) and
 users.id in
   (Select userId 
    from events
    where events.id=8);
Select name
from users u1
where users.id in
   (Select userId 
    from events
    where events.id=4) and
 users.id not in
   (Select userId 
    from events
    where events.id=7);