2015-02-09 166 views
0

我嘗試使用此查詢從選定的健身房獲取所有用戶。Mysql - 在where子句中忽略狀態

我的問題是查詢忽略這一部分:ual.user_id = weekUsers.user_id

好像查詢到符合我選擇,沒有如果用戶在我要選擇健身房檢查日期的所有用戶ID。

在圖片上我可以看到,ual.user_idweekUsers.user_id不相等,我仍然在結果中得到它們。

這裏是我的查詢:

SELECT count(ual.user_id), FROM_DAYS(TO_DAYS(ual.time) -MOD(TO_DAYS(ual.time) -1, 7)) as weekNum, 

     ual.user_id, weekUsers.user_id, u.id, u.gym 

     FROM user_activity_log ual 

     LEFT OUTER JOIN user u 

     ON u.gym = 3 

     LEFT OUTER JOIN (SELECT ualWeek.user_id FROM user_activity_log ualWeek 

     GROUP BY FROM_DAYS(TO_DAYS(ualWeek.time) -MOD(TO_DAYS(ualWeek.time) -1, 7)), ualWeek.user_id 

     HAVING count(ualWeek.user_id) > 1) weekUsers 

     ON u.id = weekUsers.user_id 

     WHERE 

     (ual.time BETWEEN '2014-02-09' AND '2015-02-09') OR (('2014-02-09' IS NULL) OR ('2015-02-09' IS NULL)) 

     AND ual.user_id = weekUsers.user_id 

     GROUP BY ual.user_id 

enter image description here

+1

a或b和c被解釋爲a或b(b和c)。 – PetSerAl 2015-02-09 17:58:54

回答

1

讓我們來解釋你的(ual.time BETWEEN '2014-02-09' AND '2015-02-09') OR (('2014-02-09' IS NULL) OR ('2015-02-09' IS NULL))表達。

表示(ual.time BETWEEN '2014-02-09' AND '2015-02-09')A(('2014-02-09' IS NULL) OR ('2015-02-09' IS NULL))B我們得到A or B。我們有A or B AND ual.user_id = weekUsers.user_id

由於默認操作的優先級會這樣解釋A or (B AND ual.user_id = weekUsers.user_id)所以如果A是真實的,那麼整個邏輯表達式爲真,ual.user_id = weekUsers.user_id未選中,簡單地忽略。

您可以參考http://www.bennadel.com/blog/126-sql-and-or-order-of-operations.htmhttp://www.bennadel.com/blog/126-sql-and-or-order-of-operations.htm 到運算符優先級的更多細節。