MYSQL Select / Group By: Как удалить группу из результата на основе значения одного из ее членов? - PullRequest
1 голос
/ 11 июля 2010

Рассмотрим таблицу событий ниже. Поле OrderID является внешним ключом таблицы Orders.

OrderID     EventType     TimeAdded*       Processed
   1           ...        3 Hours Ago          0
   2           ...        5 Minutes Ago        0
   1           ...        2 Hours Ago          0
   1           ...        1 Hour Ago           0    
   3           ...        12 Minutes ago       1
   3           ...        3 Hours Ago          0
   2           ...        2 Hours Ago          0

* TimeAdded является действительным полем даты и времени mysql. Я использовал удобочитаемое время, чтобы облегчить чтение вопроса.


Мне нужно получить набор результатов, который имеет каждый OrderID, только один раз, но только если ВСЕ записи, прикрепленные к данному идентификатору заказа, имеющие статус 0, были добавлены более 15 минут назад.

В этом примере порядок № 2 должен быть опущен из набора результатов, поскольку в него добавлено необработанное событие за последние 15 минут. Тот факт, что у него есть необработанное событие 2 часа назад, несущественен.

Заказ № 3 ДОЛЖЕН быть включен. Хотя одна из его записей была добавлена ​​12 минут назад, эта запись уже была обработана и не должна рассматриваться. В этом наборе должна рассматриваться только запись «3 часа назад», и она больше 15 минут назад.

Приказ № 1 СЛЕДУЕТ включать, поскольку все три необработанных события, связанные с ним, произошли более 15 минут назад.

Я не уверен, что для этого нужно использовать подзапрос или группу или, возможно, оба?

псевдокод:

SELECT * FROM OrderEvents WHERE Processed=0 GROUP BY OrderID
    OMIT WHOLE GROUP IF GROUP_MIN(TimeAdded) >= (NOW() - INTERVAL 15 MINUTE)

Я просто не уверен в правильном синтаксисе?

Ответы [ 2 ]

1 голос
/ 11 июля 2010

Это сделает работу (протестировано в MySQL Workbench):

SELECT * FROM OrderEvents WHERE Processed = 0 GROUP BY OrderID
    HAVING MAX(TimeAdded) < (NOW() - INTERVAL 15 MINUTE);
0 голосов
/ 11 июля 2010

Я думаю, что-то в этом роде:

SELECT OrderID
FROM OrderEvents
WHERE Processed=0
GROUP BY OrderID
HAVING MAX(TimeAdded) < (NOW() - 1500);

Имейте в виду, что я здесь работаю вслепую. Я думаю, что 1500 правильно, для функции now (), используемой в числовом контексте. http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_now

...