2016-02-11 2 views
0

Извините за заголовок, я не могу найти краткое имя или описание моей проблемы.Пользовательский MySql Query

TABLE_A: каждая строка представляет запрос пользователя (идентификатор, ..., статус)

TABLE_B: каждый запрос в TABLE_A может иметь 1 или более строк в TABLE_B в подразделах для запроса (ID, request_id, ...., status)

Моя система обрабатывает строки в таблице_B с помощью cron с одновременным запуском нескольких кронов. Cron устанавливает статус в таблице_B до 3 (завершен), когда он завершен.

Теперь мне нужно знать, когда все подразделы (строка таблицы_B) для каждого запроса (таблица_А) завершены, поэтому я могу обновить статус в таблице_А.

Теперь я выбираю первый запрос в таблице_A (TOP 1), затем получаю статус для всех подразделов в таблице_B и проверяю, имеют ли все из них статус == 3, это работает, но я хотел бы иметь возможность к этому с помощью одного запроса, без необходимости проверять значения в коде.

Что-то вроде этого:

select the request_id's 
    from Table_B where **all the rows** with this request_id has status=3 

Любая идея? любая помощь приветствуется.

ответ

1

Попробуйте это:

SELECT request_id 
FROM Table_B 
GROUP BY request_id 
HAVING COUNT(CASE WHEN status <> 3 THEN 1 END) = 0 

Это подберет request_id значения, которые только связанные с status = 3.

Примечание: Я предполагаю, что status является полем NOT NULL.

+0

tnx похоже, что это работает, насколько воздействие с использованием такого запроса будет иметь производительность? учитывая таблицу со 100 000 + строками – Exlord

+0

Он должен выполнить ОК, если таблица правильно проиндексирована. Вы можете попробовать его с вашими фактическими данными и рассказать нам, как он работает. Кроме того, вы можете попробовать «НЕ СУЩЕСТВУЕТ» и посмотреть, как он сравнивается. –

+0

'' кажется, что в моей маленькой тестовой таблице '' '' '' была намного быстрее, потребовалось '0,0005 сек', где запрос' NOT EXIST', написанный ниже @DRapp с подзапросом в той же таблице, занял '0,0476 сек'. но я думаю, что я должен сделать еще один тест с большим столом, чтобы быть уверенным. – Exlord

1

как о

select 
     a.id 
    from 
     Table_A a 
    where 
     a.id NOT EXISTS(select b.request_id 
          from Table_B b 
          where a.id = b.request_id 
          AND b.staus <> 3) 

если TABLE_B индексируется на (REQUEST_ID, статус). NOT EXISTS, выполняется до тех пор, пока не найдет ЛЮБОЙ, который соответствует запросу, а не КАЖДЫЙ ЗАПИСИ, который соответствует в подзапросе, поэтому он должен быстро перейти от 1 записи к следующей.

+0

tnx, это работает, но кажется, что «есть» намного быстрее. – Exlord