在我正在研究的程序中,有一个查询在表的层次结构上运行。我有公司表,每个公司都有位置(它有自己的表),每个位置都有区域,每个区域都有资产,每个资产都有项目。所有这些(公司,位置,区域,资产,项目)都有一个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
。
编辑:经过一些测试,该查询不是使我的程序变慢的查询,所以这不是不必要的哈哈,但是我今天确实学到了一些新知识,所以谢谢大家。
答案 0 :(得分:2)
可以从函数生成动态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 )
...