2013-08-20 2 views
2

В моей базе данных есть три таблицы. Я отслеживаю ход некоторых файлов (contract_id и contract_no) через процесс. Определенным шагам процесса присваивается статус (status_id и status_name). Ниже приведены примеры данных.mysql query on status

tbl_contracts 
contract_id,contract_no 
1,string 
2,string 
3,string 

tbl_searches 
search_id,contract_id,contract_no,status_id,notes,initials,search_date 
489,489,22000,1,string., string.,string,2013-05-13 
1242,489,22000,6,string., string.,string,2013-06-13 
2292,489,22000,10,string., string.,string,2013-06-14 
78,78,50000,1,string. string.,MDD,2013-05-13 
1098,78,50000,6,string. string.,MDD,2013-06-13 
949,949,14000,1,string.,string,2013-05-13 
2573,949,14000,4,string.,string,2013-08-18 

tbl_status 
status_id,status_name 
1,string1. 
2,string2. 
3,string3. 
4,string4. 
5,string5. 
6,string6. 
7,string7. 
8,string8. 
9,string9. 
10,string10. 
11,string11. 

Сейчас я хочу два запроса «отчета». Первый, который у меня есть, и он возвращает MAX status_id для каждого контракта.

SELECT contract_id,contract_no, MAX(status_id) 
FROM tbl_searches 
GROUP BY contract_id 
ORDER BY contract_no ASC; 

То, что я не могу понять, как вытащить все контракты с Максом status_id меньше 5. Я думал, что я мог бы использовать выше запрос в качестве суб запроса, но либо я делаю это не правильно или это неправильная стратегия. Ниже приведен только один пример из многих вариантов, которые я пробовал, которые либо полностью не работают, возвращают каждую строку в tbl_searches или какой-либо другой неверный результат.

SELECT contract_id,contract_no, status_id 
FROM tbl_searches 
WHERE status_id 
= 
(
SELECT MAX(status_id) 
FROM tbl_searches 
WHERE MAX(status_id) < 5 
#GROUP BY contract_id 
#ORDER BY contract_no ASC 
) 
; 
+0

Есть ли только один возможный 'contract_no' per' contract_id'? Ваши данные показывают, что есть. –

+0

Да, один из возможных contract_no на contract_id. –

ответ

1

Добавить ключевое слово HAVING в ваш первый запрос. Он похож на WHERE, но работает с агрегатной функцией, например. МАКСИМУМ.

SELECT contract_id,contract_no, MAX(status_id) 
FROM tbl_searches 
GROUP BY contract_id, contract_no 
HAVING MAX(status_id) < 5 
ORDER BY contract_no ASC 

EDIT: К сожалению, добавил contract_no к GROUP BY заявление. Спасибо, МайклБерковски.

+1

Это будет нормально, если 'contract_id' и' contract_no' всегда имеют одинаковые значения, то есть, если есть только один возможный 'contract_no' per' contract_id'. В противном случае MySQL вернет неустойчивые результаты для 'contract_no', так как он не находится в' GROUP BY'. Если они всегда совпадают (как показывают примеры данных), просто добавьте 'contract_no' в' GROUP BY'. –

+0

Вот скрипка: http://sqlfiddle.com/#!2/c223ce/2 –

+0

@MichaelBerkowski, вы правы, спасибо. Я действительно думал, что это уже было в заявлении GROUP BY :) – supertopi