2012-04-07 7 views
0

У меня есть рабочий запрос, который подсчитывает все различные значения из таблицы LDS, где STATUS = 'OK' И DATE> = '2012' И если есть несколько идентичных идентификаторов, тогда подсчитайте один с самой новой датой если этот идентификатор имеет статус «оК»:mysql query, inested where clauses

 
COUNT(DISTINCT lds1.ID) 
FROM 
    LDS lds1 
    LEFT JOIN LDS lds2 
     ON lds1.ID = lds2.ID 
     AND lds1.Date < lds2.Date 
     AND lds1.Status = 'ok' 
WHERE 
    lds1.Date >= '2012' 
    AND lds1.Status = 'ok' 
    AND lds2.ID IS NUL 

мне теперь нужно добавить еще одно условие, чтобы быть правдой, прежде чем выше запрос выполняется: «рассматривать только идентификаторы, где STATUS = NULL AND DATE> = 2011». Исходный экземпляр ID с STATUS = NULL не должен учитываться в результатах; он просто определяет, следует ли даже рассматривать идентификатор.

 
Table LDS: 

ID | STATUS | DATE 
1 | NULL | 2011 
1 | ok  | 2012 
2 | bad  | 2012 
1 | bad  | 2013 
3 | NULL | 1999 
3 | ok  | 2012 
4 | ok  | 2012 
5 | NULL | 2011 
5 | ok  | 2012 
6 | NULL | 2012 

Ожидаемый результат полного запроса: «5».

ОБНОВЛЕНИЕ:
Возможно, это может быть решено с помощью массивов?
1. возьмите все идентификаторы из таблицы LDS, где STATUS = NULL AND DATE> = 2011 и помещены в массив (результат: ID1, ID5, ID6)
2. Для каждого идентификатора в массиве проверьте все экземпляры в таблице и выберите один с наибольшей датой и STATUS IS NOT NULL (результат: ID1, ID5)
3. Посчитайте, сколько из них имеет статус = OK (результат: ID5)

ответ

0
COUNT(DISTINCT lds1.ID) 
FROM 
    LDS lds1 
    LEFT JOIN LDS lds2 
     ON (lds1.ID = lds2.ID) 
    WHERE 
     lds1.Date = '2012-01-01' 
    AND lds1.Status = 'ok' 
    AND lds2.ID IS NOT NULL 

попробовать использовать где положение для условий

+0

привет Мустафа - возникла проблема с большими/меньшими знаками, которые интерпретируются в тегах html в моем исходном сообщении. это было «исправлено». – user1291842

0

Я считаю, что нашел ответ. Может быть, кто-то мог это проверить.

 
COUNT DISTINCT ID 
FROM lds 
    WHERE ID in 
( 
COUNT(DISTINCT lds1.ID) 
FROM 
    LDS lds1 
    LEFT JOIN LDS lds2 
     ON lds1.ID = lds2.ID 
     AND lds1.Date<lds2.Date 
     AND lds1.Status = 'ok' 
    WHERE 
     lds1.Date>='2012' 
     AND lds1.Status = 'ok' 
     AND lds2.ID IS NUL 
) 
AND DATE>='2011' AND STATUS=NUL