2013-08-20 94 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