我有一个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。这可行,但不是最优的,并且在许多情况下会中断,因为必须自动生成此查询。
有人对我应该如何处理这个问题有一个很好的建议吗?
答案 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();