几个基本的SQL查询问题
基本上我有一个小事件系统,但我有一些奇怪的SQL查询问题。第一,我需要找到所有报名参加所有3项活动的人的名字。 我试着做:几个基本的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个事件 第二个,我需要找到一个报名参加第四次活动但不参加第七次活动的人 我试过: 它返回的结果与不使用!=标记,因为
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);