1

有一个表client_application用类似这样的数据调用;

Id   user_id   name      creationDate
---------------------------------------
1    5         name1     date
2    4         name2     date
3    98        name3     date

还有一个名为的表application_status,其中包含应用程序的状态提要(application_id是外键);

Id   aplication_id   status            other_columns      creationDate
----------------------------------------------------------------------
1    1       APPLICATION_SUMITTED      data               date
2    2       APPLICATION_SUMITTED      data               date
3    1       APPLICATION_RECEVIED      data               date
4    1       BANK_APPROVED             data               date
5    3       APPLICATION_SUMITTED      data               date
6    2       APPLICATION_RECEVIED      data               date

我想通过他们的状态查询应用程序。例如获取最新提交的申请?或获得银行批准的申请。

如何实现这样的 SQL 查询?

我试过了;

SELECT *
FROM (SELECT * FROM application_status ORDER BY creationDate DESC) t1
LEFT JOIN client_application on client_application.id = t1.application_id
GROUP BY t1.application_id;

这很好,我可以获取具有最新状态的应用程序,但是当我尝试在其中添加 where 子句时;

SELECT *
FROM (SELECT * FROM application_status ORDER BY creationDate DESC) t1
LEFT JOIN client_application on client_application.id = t1.application_id
where t1.status = 'APPLICATION_SUBMITTED'
GROUP BY t1.application_id;

它返回所有application_status具有APPLICATION_SUBMITTED状态列。它返回application_id1 项(检查上表),但如您所见,ID 号为 1 的应用程序的APPLICATION_RECEIVED状态为最新状态项。所以我不希望结果集中有这个。

也许我的方法是完全错误的。我愿意接受任何解决方案。

谢谢。

4

3 回答 3

1

我不知道你为什么要在那里组,但也许你只是想

select apps.*, ca.*
from application_status apps
 left join client_application ca on ca.id = apps.application_id
WHERE apps.status = 'APPLICATION_SUBMITTED'
  AND not exists ( select 1 
                   from application_status 
                   where application_id = apps.application_id 
                     and creationdate > apps.creationdate 
                  )
ORDER BY apps.creation_date DESC, apps.application_id

编辑sql 小提琴

于 2012-11-27T13:11:19.570 回答
1

我的建议是通过创建一个新表“状态”来改进数据库的设计,例如:

Id   Label
1    APPLICATION_SUBMITTED
2    APPLICATION_RECEIVED
3    BANK_APPROVED 

您必须给标签一个逻辑顺序,并在您的状态或主表中引用此表。

检索应用程序的状态会更容易(其中 Status.Id < 3 选择所有未批准的应用程序,或者 Status.Id > 1 选择至少收到的所有应用程序)。

它也更好地用于维护目的。这种逻辑在很多情况下都适用,你应该考虑花更多的时间来设计你的数据模型,这样你就不会花更多的时间来解决你现在面临的这类问题。

于 2012-11-27T13:18:03.367 回答
1

试试这个:

SELECT *
FROM (SELECT * FROM (SELECT * FROM application_status ORDER BY creationDate DESC) AS A GROUP BY application_id) AS t1
LEFT JOIN client_application ON client_application.id = t1.application_id
WHERE t1.status = 'APPLICATION_SUBMITTED'
于 2012-11-27T13:21:58.410 回答