Странное расхождение в запросах с использованием UNIX_TIMESTAMP - PullRequest
1 голос
/ 28 марта 2011

Может ли кто-нибудь объяснить несоответствие между следующими запросами:

Запрос 1 (возвращает 87 результатов):

SELECT userId, COUNT(userId) as usercount
FROM `cpnc_PaymentOrder` 
WHERE  created >= UNIX_TIMESTAMP('2011-03-01')
GROUP BY userId
HAVING usercount > 1

Запрос 2 (возвращает 177 результатов):

SELECT userId, COUNT(userId) as usercount
FROM `cpnc_PaymentOrder` 
WHERE  created >= UNIX_TIMESTAMP('2011-02-01')
GROUP BY userId
HAVING usercount > 1

Запрос 3 (возвращает 55 результатов):

SELECT userId, COUNT(userId) as usercount
FROM `cpnc_PaymentOrder` 
WHERE  created >= UNIX_TIMESTAMP('2011-02-01')
AND created < UNIX_TIMESTAMP('2011-03-01')
GROUP BY userId
HAVING usercount > 1

Теперь я бы подумал , что число результатов из запроса 2 за вычетом количества результатов из запроса 1 будет равноколичество результатов из запроса 3. Но это не так.Может кто-нибудь объяснить, почему?

Спасибо, Иона

РЕДАКТИРОВАТЬ:

для уточнения, запрос, который я хочу написать:

SELECT userId
FROM `cpnc_PaymentOrder` 
WHERE  created >= UNIX_TIMESTAMP('2011-02-01')
AND created < UNIX_TIMESTAMP('2011-03-01')
AND userId "appears in at least one other record from before '2011-03-01'"

Ответы [ 3 ]

5 голосов
/ 28 марта 2011

Поскольку вы сравниваете количество групп .

Давайте рассмотрим это на небольшом примере:

user_id | created
      1 | 2011-02-02
      1 | 2011-02-02
      1 | 2011-02-02
      2 | 2011-02-02
      2 | 2011-02-02
      1 | 2011-03-02
      1 | 2011-03-02
      2 | 2011-03-02
      2 | 2011-03-02

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

Просто удалите GROUP BY и посмотрите разницу (без GROUP BY математика, конечно, будет соответствовать)

0 голосов
/ 28 марта 2011
 user_id | created
       1 | 2011-02-02
       1 | 2011-03-02
       1 | 2011-03-02

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

0 голосов
/ 28 марта 2011

Запрос 1 имеет: WHERE created > = UNIX_TIMESTAMP('2011-03-01')
то есть. дата больше…

Запрос 3 имеет: WHERE created <</strong> UNIX_TIMESTAMP('2011-03-01')
то есть. дата меньше…

Итак, запрос 3 не является пересечением запросов 1 и 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...