2016-11-19 71 views
0

我有一個php應用程序,可以讓人們通過添加過濾器來搜索數據。查詢將根據他們的輸入自動生成。 因此,例如,他們可以爲需要的Date is greater than添加過濾器。 然後,他們還可以添加多個過濾器,其中至少需要一個過濾器。 這工作得很好,但是,問題是某些過濾器依賴於聚合函數,如SUM需要將其放入HAVING子句。這基本上破壞了搜索邏輯,因爲我們無法再將該過濾器與由OR分隔的其他過濾器相匹配。如果WHERE子句中的條件爲假,只需要HAVING子句中的約束條件

在下面的例子中,他們希望找到所有的人以這些過濾器:

日期大於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。這可以工作,但不是最優的,並且在很多情況下會中斷,因爲這個查詢將不得不自動生成。

有沒有人得到我應該如何解決這個問題的好建議?

回答

0

的Mysql允許具有被用作一個WHERE,所以將你的所有WHERE條件HAVING

HAVING 
     expense.date > 2015 
    AND (
     (person = 'Johnny' OR product = 'Vaccination') 
    OR (total > 10)) 
+0

我需要選擇所有這些,都需要有它可以在具有可以使用的列,這可能有一些性能影響,但除此之外,我想這會奏效。乾杯 –