2

我的数据库有三个表。我正在通过一个流程跟踪一些文件(contract_id 和contract_no)的进度。流程中的某些步骤被分配了一个状态(status_id 和 status_name)。以下是样本数据。

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;

我想不通的是如何提取 Max 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
)
;
4

1 回答 1

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 语句。谢谢迈克尔伯科夫斯基。

于 2013-08-20T11:03:32.467 回答