2011-11-17 56 views
1

下面的查詢不返回任何結果SQL查詢 - 使用AND

SELECT user_id FROM test WHERE poll_id = 2 AND (question_id = 2 AND answer_id = 5) AND (question_id = 3 AND answer_id = 8); 

這是正確的語法或沒有?

表數據是

|poll_id | question_id | answer_id | user_id | 
|--------|-------------|-----------|---------| 
| 2  | 2   | 5  | 2  | 
| 2  | 3   | 8  | 2  | 

結果應該是2

+0

你需要一個用戶有3兩5 2和8,或者你只需​​要一方? – Jodaka

+0

這就是我想要的,我需要用戶有兩個條件滿足 – vishal

+0

爲什麼java標籤爲這個Q?! –

回答

6

它不會因爲你的where子句不匹配

AND條件,您應將其更改爲:

SELECT user_id FROM test WHERE poll_id = 2 
AND 
((question_id = 2 AND answer_id = 5) 
OR (question_id = 3 AND answer_id = 8)); 

UPDATE

SELECT t.user_id FROM test t WHERE poll_id = 2 
AND exists ( select 1 from test where 
(question_id = 2 AND answer_id = 5 and user_id=t.user_id)) 
AND question_id = 3 AND answer_id = 8 
+0

我想要滿足兩個結果的結果,即具有(question_id = 2和answer_id = 5)和(question_id = 3和answer_id = 8)的用戶 – vishal

+0

@vishal:我不認爲你明白...您的數據中沒有任何內容可以同時滿足兩個條件。我的意思是,有兩行匹配兩個條件**獨立**但沒有可能匹配**兩條**條件的行; **不可能**。仔細查看你的數據,你就會明白我的意思。 – Icarus

+0

@伊卡洛斯其實問題不清楚,喬達卡的答案在這裏是正確的。 – mrembisz

1

您需要使用至少一個或與組或運算部分,以防止任何precendence錯誤:

SELECT user_id FROM test WHERE poll_d = 2 
    AND ((question_id = 2 AND answer_id = 5) 
     OR (question_id = 3 AND answer_id = 8)); 

這意味着:所有具有poll_d = 2question_id = 2 AND answer_id = 5question_id = 3 AND answer_id = 8(技術上使用OR)的條目將意味着「至少一個......「,但在你的情況下,沒有辦法使一行匹配兩個條件)。

你的查詢可以被理解爲具有poll_d = 2所有條目都question_id = 2 AND answer_id = 5question_id = 3 AND answer_id = 8(這是不可能的,因此查詢沒有結果)。

請注意,在這種情況下您會得到2個結果。如果你想只有一個,使用distinct關鍵字:SELECT distinct(user_id) FROM ...

+0

我想要的結果將滿足條件 – vishal

+0

@vishal恐怕這是不可能在一個選擇,因爲沒有行將滿足這兩個條件。但是,您可以使用'count(*)'來檢查是否有兩個結果。如果不是,至少有一個條件不滿足。或者使用類似於其他答案指示的子查詢,但請注意,當條件更多時,這些會變得更加複雜(基於聯接的解決方案可能會因爲首先必須構建聯接而導致性能變差)。 – Thomas

4

您在布爾邏輯這裏有些困難。另外,你可能有一個錯字在第一條件(poll_d) 什麼你可能想要的是

SELECT user_id FROM test WHERE poll_id = 2 AND 
((question_id = 2 AND answer_id = 5) OR (question_id = 3 AND answer_id = 8)); 

在查詢括號並不在所有問題,因此它可以被翻譯爲

SELECT user_id FROM test WHERE poll_id = 2 
AND question_id = 2 AND answer_id = 5 
AND question_id = 3 AND answer_id = 8; 

question_id = 2 AND question_id = 3根據布爾邏輯和理智是False。同樣確實爲answer_id = 5 AND answer_id = 8

1
SELECT user_id FROM test WHERE poll_d = 2 
AND ((question_id = 2 AND answer_id = 5) 
OR (question_id = 3 AND answer_id = 8)); 
0

使用DISTINCT SQL方法試試。

SELECT DISTINCT(user_id) FROM test WHERE poll_d = 2 
AND ((question_id = 2 AND answer_id = 5) 
OR (question_id = 3 AND answer_id = 8)); 

而你的布爾邏輯,我用了OR

PS:未經測試。

2

在上一個條件中將AND更改爲OR

SELECT 
    user_id FROM test 
WHERE poll_d = 2 
AND (question_id = 2 AND answer_id = 5) 
OR (question_id = 3 AND answer_id = 8); 
1

括號在你的where語句沒有效果。 你寫過 question_id = 3 AND question_id = 2, 當然它不會返回任何結果! 也許你需要像這樣

SELECT user_id FROM test WHERE poll_d = 2 AND ((question_id = 2 AND answer_id = 5) OR (question_id = 3 AND answer_id = 8)) 
0

嘗試。

SELECT user_id FROM test WHERE poll_d = 2 
AND ((question_id = 2 AND answer_id = 5) 
OR (question_id = 3 AND answer_id = 8)); 

它給0記錄的原因是因爲過濾器(WHERE條件)實際上應用於單行。該查詢的工作原理如何將您的過濾器與每一行相匹配。

1

你需要加入兩個記錄,因此:

select p1.user_id from poll p1, poll p2 
where p1.poll_id = 2 and p2.poll_id = 2 and 
p1.question_id = 2 and p1.answer_id = 5 and 
p2.question_id = 3 and p2.answer_id = 8 and 
p1.user_id = p2.user_id