2013-08-20 93 views
2

我的數據庫有三個表。我通過一個過程跟蹤某些文件(contract_id和contract_no)的進度。該流程中的某些步驟會分配一個狀態(status_id和status_name)。以下是樣本數據。mysql查詢狀態

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_id'只有一個可能的'contract_no'嗎?你的樣本數據表明存在。 –

+0

是的,每個contract_id可能有一個contract_no。 –

回答

1

將關鍵字HAVING添加到您的第一個查詢中。它類似於WHERE,但它可以與集合函數一起工作,例如MAX。

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 

編輯:哎呀,加contract_no到GROUP BY語句。感謝MichaelBerkowski。

+1

如果'contract_id'和'contract_no'總是具有相同的值,也就是說,如果每個'contract_id'只有一個可能的'contract_no',這就可以。否則,MySQL將返回'contract_no'的不穩定結果,因爲它不在GROUP BY中。如果它們始終相同(如示例數據所示),只需將'contract_no'添加到'GROUP BY'。 –

+0

這是一個小提琴:http://sqlfiddle.com/#!2/c223ce/2 –

+0

@MichaelBerkowski,你是對的,謝謝。我實際上認爲它已經在GROUP BY語句中:) – supertopi