使MySQL函数可变地创建where子句的最简单方法是什么?

时间:2019-01-04 14:44:44

标签: mysql sql

在我正在研究的程序中,有一个查询在表的层次结构上运行。我有公司表,每个公司都有位置(它有自己的表),每个位置都有区域,每个区域都有资产,每个资产都有项目。所有这些(公司,位置,区域,资产,项目)都有一个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子句,如果是10,则取决于company.active = 1/0

编辑:经过一些测试,该查询不是使我的程序变慢的查询,所以这不是不必要的哈哈,但是我今天确实学到了一些新知识,所以谢谢大家。

1 个答案:

答案 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 )
    ...