php - 如果 WHERE 子句中的条件为假,则仅在 HAVING 子句中需要约束

标签 php mysql

我有一个 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/

相关文章:

php - 使用数据库中的值和列名动态创建输入字段

php - 提交时登录表单重定向回自身

php - 数据库没有更新,但没有出现错误。 MySQL 和 PHP

php - 尝试在mysql查询中显示最大时间记录

php - Symfony 2 实体字段属性

php - 在页面重新加载时保存 javascript 复选框状态?

php - 在 PHP 中将数组键更改为数字

php - Composer 安装到目标文件夹

php - 更新具有相同 id 和相同值的多行

c# - 将浮点型转换为字符串