2010-02-09 78 views
2

基本上我得到了一個小型事件系統,但我遇到了一些奇怪的SQL查詢問題。第一個我需要找到已經註冊了所有3個活動的所有人名。 我試圖做的:幾個基本的SQL查詢問題

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

歡迎#1。您能否編輯您的問題以提供這兩個表的描述/模式? – JonathanK 2010-02-09 18:42:53

回答

5

首先,events.id不能等於4,7和8在同一時間(我認爲你在這裏尋找OR運算符)。第二個問題是,你不能同時將同一列與4和7進行比較 - 它會查找4和7以外的東西(這4次肯定是我上次檢查的時間)。

+0

'!='適用於T-SQL(與'<>'一樣)。 – 2010-02-09 18:44:28

+0

@邁克爾 - 謝謝你,我在這方面改變了我的答案。 – 2010-02-09 18:46:22

+0

'!='是ANSI-92 iirc – 2010-02-09 18:46:27

1

如前所述,events.id只能保存一個值;如果您想查找多個值,請使用OR。另外,由於它只能是單個值,它將自動不等於其他任何值。你是否想加入events的第二個副本並檢查另一個副本?

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' 
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 
) 
+0

這看起來像是正確的想法,儘管連接必須在子查詢中重複 – 2010-02-09 19:37:04

0

從未使用自然連接(這不是在SQL Server avaliable)和你的結構似乎有點奇怪給我,但嘗試:

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來標識你嗎?)?您應該有一個與事件表相關的事件參與者表,事件表shoudl只描述specidfic事件而不是參與者的多重事件。

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