如果WHERE子句中的条件为false,则仅在HAVING子句中要求约束

时间:2016-11-19 20:38:56

标签: php mysql

我有一个php应用程序,可以让人们通过添加过滤器来搜索数据。将根据输入自动生成查询。 例如,他们可以为Date is greater than添加必需的过滤器。 然后,他们还可以添加几个过滤器,其中至少需要一个过滤器。 这样可以正常工作,但问题是某些过滤器依赖于需要放入SUM子句的HAVING等聚合函数。这基本上打破了搜索逻辑,因为我们无法再将该过滤器与由OR分隔的其他过滤器匹配。

在下面的示例中,他们希望找到具有这些过滤器的所有人:

日期大于2015年 和 (人是Johnny OR产品是疫苗接种或总费用大于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中,如果该列为false,则在HAVING上执行IF。这可行,但不是最优的,并且在许多情况下会中断,因为必须自动生成此查询。

有人对我应该如何处理这个问题有一个很好的建议吗?

1 个答案:

答案 0 :(得分:1)

Mysql允许将HAVING用作WHERE,因此将所有WHERE条件移至HAVING

List<Fruit> fruits = new ArrayList<>();
fruits.add(new Apple());
fruits.add(new Orange());

Observable<GroupedObservable<Fruit>> fruitGroup = Observable.from(fruits)
    .groupBy(fruit -> fruit.getClass())
    .cache();

Observable<Boolean> appleActions = fruitGroup
    .filter(fruitG -> fruitG.getKey().equals(Apple.class))
    .flatMap(fruitG -> {
        return flatMap(apple -> Observable.just(apple.peel()))
    })

Observable<Boolean> orangeActions = fruitGroup
    .filter(fruitG -> fruitG.getKey().equals(Orange.class))
    .flatMap(fruitG -> {
        return flatMap(orange -> Observable.just(orange.cutInHalf()))
    })

appleActions.concatWith(orangeActions).subscribe();