基本上我有一个小事件系统正在进行,但我有几个奇怪的SQL查询问题。第一个我需要找到已注册所有3个事件的所有人名。 我试着这样做:
SELECT name
FROM users
NATURAL JOIN events
WHERE events.id = '4' AND events.id = '7' AND events.id = '8'
但它返回零行,即使有用户已注册所有3个事件
第二个,我需要找一个报名参加活动4而不参加活动7的人 我试过了:
SELECT name
FROM users
NATURAL JOIN events
WHERE events.id = '4' AND events.id !='7'
它返回与没有!=标记相同的结果,因为它至少应该消除一些结果。
提前致谢。
答案 0 :(得分:5)
首先,events.id不可能同时等于4,7和8(我认为你在这里寻找OR运算符)。第二个问题是你不能同时将同一列与4和7进行比较 - 它会查找4和不同于7的东西(当然我最后一次检查的是4)。
答案 1 :(得分:1)
如上所述,events.id
只能包含一个值;如果要查找多个值,请使用OR
。此外,由于它只能是单个值,因此它将自动不等于每个其他值。您是否想要使用events
的第二个副本进行联接并检入另一个副本?
答案 2 :(得分:1)
第一个问题怎么样。
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
)
答案 3 :(得分:0)
您正在尝试匹配结果集中的多个行。为此,您需要多次连接“events”表将这些行向上滚动到一行。例如:
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'
答案 4 :(得分:0)
从未使用过自然连接(它在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
但是你真的在事件表中存储了不同的用户ID(你没有使用id的名字吗?)?您应该有一个与事件表相关的事件参与者表,而事件表shoudl只描述特定事件,而不是参与其中的多人。
答案 5 :(得分:0)
不是试图通过使用NATURAL JOIN来加入,而是约束连接。
每个用户是多个事件,因此event.userId是event.id的外键吗?如果 所以,试试
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);