在我正在处理的程序中,有一个在表的层次结构上运行的查询。我有公司表,每个公司都有自己的位置(它有自己的表),每个位置都有区域,每个区域都有资产,每个资产都有项目。所有这些(公司、位置、区域、资产、项目)都有一个active布尔字段。
当用户进入屏幕时,所显示的内容是基于其个人筛选器显示的,他们可以选择只查看活动的公司/地点/区域/资产/项目,或者只查看不活动的公司/地点/区域/资产/项目,或者他们没有选择,然后两者兼而有之。
目前,这是通过使用一串if语句来构造查询字符串来完成的,并且查询本身有很大的返回量,因此它可能会很慢,而且它还会使代码变得难看,并且不太容易维护/更改。我想通过使用MySQL函数来加快速度。
现在,我唯一能想到的就是为每一种情况提出一个具体的理由。有人没有任何过滤器-案例1。有人想要过滤只由活跃/不活跃的公司-案例2。只按地点-案例3.只有项目-案例6。那么我必须处理每一个组合的每一个案例,现在我们谈论了很多案例。
我认为我对SQL的了解一定是有限的,而且可能有更好的方法来做到这一点。有什么想法吗?
我所想的是,MySQL函数声明将类似于
FUNCTION `getData` (
companyActive integer,
locationActive integer,
areaActive integer,
assetActive integer,
projectActive integer
)其中每个整数为:
-1。0仅返回该类型的非活动类型。1活动。因此,如果是companyActive = -1,则没有where子句,如果是1或0,则company.active = 1/0依赖。
编辑:经过一些测试,这个查询并没有减慢我的程序,所以这是不必要的哈哈,但是我今天确实学到了一些新的东西,谢谢各位。
发布于 2019-01-04 14:56:48
从函数生成动态SQL是可能的,但逻辑可能与您在php中已经开发的非常相似。
用例的一个解决方案可能是只编写一个SQL语句,它的WHERE子句将接受所有参数并同时处理所有案例。然后,不管用户选择了哪些选项,都有一个语句要执行。
SELECT
...
FROM
company
INNER JOIN location ON ...
INNER JOIN area ON ...
WHERE
1 = 1
AND ( :companyActive = -1 OR company.active = :companyActive )
AND ( :locationActive = -1 OR location.active = :locationActive )
AND ( :areaActive = -1 OR area.active = :areaActive )
...https://stackoverflow.com/questions/54041142
复制相似问题