几个基本的SQL查询问题

时间:2010-02-09 18:39:10

标签: sql

基本上我有一个小事件系统正在进行,但我有几个奇怪的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'

它返回与没有!=标记相同的结果,因为它至少应该消除一些结果。

提前致谢。

6 个答案:

答案 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);