2015-02-09 3 views
0

Я пытаюсь использовать этот запрос, чтобы получить всех пользователей из выбранного тренажерного зала.Mysql - Игнорированное состояние в том, где статья

Моя проблема заключается в том, что запрос игнорирует эту часть: ual.user_id = weekUsers.user_id

Похоже, запрос принимает все идентификаторы пользователей, которые соответствуют даты я выбрал без проверки, если это пользователи в тренажерном зале, я хочу, чтобы выбрать.

На изображении, который я положил, вы можете видеть, что ual.user_id и weekUsers.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 OR b AND c' интерпретируется как' a OR (b AND c) '. – PetSerAl

ответ

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.htm и http://www.bennadel.com/blog/126-sql-and-or-order-of-operations.htm для более подробной информации о приоритете операций.

Смежные вопросы