有一个名为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_id
1个项目(请查看上面的表格),但正如您所看到的,ID为1的应用程序的状态为APPLICATION_RECEIVED
最新状态项。所以我不希望在结果集中使用此项。
也许我的方法完全错了。我愿意接受任何解决方案。
感谢。
答案 0 :(得分: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
答案 1 :(得分:1)
我的建议是通过创建一个新表'Status'来改进数据库的设计,例如:
Id Label
1 APPLICATION_SUBMITTED
2 APPLICATION_RECEIVED
3 BANK_APPROVED
您必须为标签指定逻辑顺序,并在状态或主表中引用此表。
检索应用程序的状态会更容易(其中Status.Id&lt; 3选择所有未批准的应用程序,或者Status.Id&gt; 1选择所有至少收到的应用程序)。< / p>
它也更适合维护目的。这种逻辑适用于很多情况,你应该考虑花更多的时间来设计你的数据模型,这样你就不会花更多的时间来解决你现在面临的这类问题。
答案 2 :(得分: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'