我有一个 php 应用程序,可以让人们通过添加过滤器来搜索数据。将根据他们的输入自动生成查询。
因此,例如,他们可以为 Date is greater than
添加一个过滤器,这是必需的。
然后他们还可以添加几个过滤器,其中至少需要一个过滤器。
这工作正常,但是,问题是一些过滤器依赖于聚合函数,例如需要放入 HAVING
子句中的 SUM
。这实质上破坏了搜索逻辑,因为我们无法再将该过滤器与由 OR
分隔的其他过滤器进行匹配。
在下面的示例中,他们想要找到所有具有这些过滤器的人:
大于 2015 年的日期 和 (人是约翰尼或产品是疫苗接种或总费用大于 10)
SELECT
SUM(expense) as total
FROM
people
JOIN
expense ON expense.person = id
WHERE
expense.date > 2015
AND
(person = 'Johnny' OR product = 'Vaccination')
GROUP BY
id
HAVING
(total > 10) -- Only want to require this constraint if the conditions in WHERE brackets clause are false
由于其中一个过滤器使用聚合函数,我们无法将其与其他过滤器进行匹配。
我试过将 where 条件作为 SELECT 中的一列,如果该列为假,则在 HAVING 上执行 IF。这可行,但不是最优的,并且在许多情况下会中断,因为必须自动生成此查询。
有没有人对我应该如何处理这个问题有好的建议?
最佳答案
Mysql允许HAVING作为WHERE使用,所以把你所有的WHERE条件都移到HAVING
HAVING
expense.date > 2015
AND (
(person = 'Johnny' OR product = 'Vaccination')
OR (total > 10) )
关于php - 如果 WHERE 子句中的条件为假,则仅在 HAVING 子句中需要约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40697673/