我正在尝试编写以下问题陈述的查询。 我想写一个查询,我可以找到有效和无效的签证。 目前我的表中有两种签证类型
我有主表 tbl_employee_visa_request ,其中存储了员工提出的所有请求。
我有两张桌子( tbl_visa_request_status 和 tbl_uscis ),我必须检查签证是否有效。
tbl_visa_request_status 的结构是
id | requestId| visaStartDate|visaEndDate
-----------------------------------------
1 | 123| 01-01-2017|31-03-2017
2 | 567| 01-01-2017|19-12-2018
3 | 45456| 01-01-2017|01-01-2016
4 | 56756| 01-01-2017|17-03-2017
5 | 343| 01-01-2017|01-01-2019
tbl_uscis
id | requestId| caseNumber|isActive
-----------------------------------------
1 | 123| A435|1
2 | 567| 1BCFG324|0
3 | 45456| 234R|0
4 | 56756| AB456|1
5 | 343| AKO45|1
如果我必须检查工作许可证 Visa的有效性,那么我必须检查 tbl_uscis 中的 isActive 字段。如果为0则无效,如果为1则为有效。
如果我想检查商务签证的有效性,那么我必须进行比较 当前日期 tbl_visa_request_status 中的 visaEndDate 。如果EndDate大于当前日期,则Valid Other Invalid。
我已经编写了一个查询,通过使用以下两个查询的 union 来实现此功能:
SELECT vt.`visa_type` AS visaType
,COUNT(CASE WHEN vrs.`visa_end_date` > NOW() THEN 1 END) AS Valid
,COUNT(CASE WHEN vrs.`visa_end_date` < NOW() THEN 1 END) AS InValid
FROM `tbl_visa_request_status` vrs
LEFT JOIN `tbl_employee_visa_request` evr
ON evr.id = vrs.`tbl_employee_visa_request_id`
LEFT JOIN `tbl_visa_type` vt
ON evr.`tbl_visa_type_id` = vt.`id`
WHERE evr.`tbl_visa_type_id` != 2
GROUP BY evr.`tbl_visa_type_id`
UNION
SELECT vt.`visa_type` AS visaType
,COUNT(CASE WHEN u.`is_active` = 1 THEN 1 END) AS Valid
,COUNT(CASE WHEN u.`is_active` = 0 THEN 1 END) AS InValid
FROM `tbl_uscis` u
LEFT JOIN `tbl_employee_visa_request` evr
ON evr.id = u.`tbl_employee_visa_request_id`
LEFT JOIN `tbl_visa_type` vt
ON evr.`tbl_visa_type_id` = vt.`id`
GROUP BY evr.`tbl_visa_type_id`;
我在图像中输出。
但我的问题是,当有新的签证类型,我必须检查不同的有效条件,然后我将不得不写一个新的查询,将与当前查询结合。
我想要找到的是,有更好的方法来实现此功能,而不是编写一个全新的查询,我只需更改单个查询的 where子句中的某些条件当我的数据库中添加了新的签证类型时。
答案 0 :(得分:0)
您必须将有效性标准存储在所有类型签证的单个表中,以便在添加新签证类型时不必重写查询。
只要不同类型的详细信息存储在不同的查询中,您就必须在每次添加新签证类型时更改查询。您可以使用联接而不是联盟,但新的签证类型仍然意味着新的联接。
我会创建一个visas
表来保存所有签证的所有常用数据,其中包括有效期开始和结束日期(如果没有这两个日期,我从未见过签证)。如果添加新的签证类型,您可以使用这些数据编写一个甚至不需要修改的查询。