2017-03-25 19 views
1

我有一個存儲用戶信息的表。如果滿足3個不同的條件,我試圖從表中獲得一個匹配。雖然所有條件都是正確的,但這些條件單獨工作但分組時不起作用。 SQL語句有3種不同的條件;如何將括號中的多個WHERE子句分組以獲得更準確的結果

  1. 幾個OR括號
  2. 括號
  3. 兩個AND條件
  4. 一個條件在托架的條件。

這是聲明。

SELECT DISTINCT userId 
FROM userinfo_table 
WHERE ((questionName IN("cars") AND intValue & 3) OR 
     (questionName IN("farms") AND intValue & 3) OR 
     (questionName IN("pets") AND intValue & 5) 
    ) AND 
     (questionName="birthdate" AND 566092800<=UNIX_TIMESTAMP(dateValue)7 7 <=1572480000) AND 
    (userId <> 3) 
LIMIT 0, 20 

condition 1是:

(questionName IN("cars") AND intValue & 3) OR (questionName IN("farms") AND intValue & 3) OR (questionName IN("pets") AND intValue & 5)` 

條件2

questionName="birthdate" AND 566092800<=UNIX_TIMESTAMP(dateValue)<=1572480000` 

條件3 用戶id <> 3

請我是錯的括號?或者我沒有做對嗎?

回答

1

問題不在括號中。問題是你想要比較同一個userId不同行上的值。你不能用簡單的WHERE子句來做到這一點。

這是您的查詢,因爲我把它解釋:

SELECT DISTINCT userId 
FROM userinfo_table 
WHERE ((questionName IN ('cars') AND intValue & 3) OR 
     (questionName IN ('farms') AND intValue & 3) OR 
     (questionName IN ('pets') AND intValue & 5) 
    ) AND 
     (questionName = 'birthdate' AND UNIX_TIMESTAMP(dateValue) <= 1572480000 
    ) AND 
     userId <> 3; 

(條件2不清楚你的問題)。

顯然,沒有行可以滿足所有條件,因爲questionName必須有多個值。我想,你打算:

SELECT userId 
FROM userinfo_table 
WHERE (((questionName IN ('cars') AND intValue & 3) OR 
     (questionName IN ('farms') AND intValue & 3) OR 
     (questionName IN ('pets') AND intValue & 5) 
     ) OR 
     (questionName = 'birthdate' AND UNIX_TIMESTAMP(dateValue) <= 1572480000 
     ) 
    ) AND 
     userId <> 3 
GROUP BY userId 
HAVING SUM(questionName = 'birthdate') > 0 AND -- at least one birthdate record 
     COUNT(DISTINCT questionName) > 1;  -- at least one other matching record 

編輯:

哦,我想我找到了狀態2.你不能寫這樣的(當然,你可以,但它不會做你認爲它)

SELECT userId 
FROM userinfo_table 
WHERE (((questionName IN ('cars') AND intValue & 3) OR 
     (questionName IN ('farms') AND intValue & 3) OR 
     (questionName IN ('pets') AND intValue & 5) 
     ) OR 
     (questionName = 'birthdate' AND 
     UNIX_TIMESTAMP(dateValue) >= 566092800 AND 
     UNIX_TIMESTAMP(dateValue) <= 1572480000 
     ) 
    ) AND 
     userId <> 3 
GROUP BY userId 
HAVING SUM(questionName = 'birthdate') > 0 AND -- at least one birthdate record 
     COUNT(DISTINCT questionName) > 1;  -- at least one other matching record 
+0

好,:)我試了一下,它的工作。非常感謝 :) –

相關問題