2015-02-05 171 views
0

您好,我在下面有一個簡單的示例查詢,這實際上並不是我正在使用的,因爲它在這裏解釋太複雜了。基本上這個查詢正在用於Web應用程序的搜索。Mysql:在沒有子查詢的地方使用GROUP_CONCAT&FIND_IN_SET

由於此查詢可以拉出的數據量我試圖避免使用HAVING或子查詢,因爲它大大增加了檢索數據所花費的時間量。

我想在where子句中使用FIND_IN_SET,但顯然GROUP_CONCAT不能在where子句中使用,所以我想嘗試下面這樣簡單但我不認爲變量設置在where和no結果被返回。

SELECT 
    v.message, 
    @cat_values:= GROUP_CONCAT(c.category_value) as cat_values 
FROM 
    #Where the audit message is stored 
    AUDIT_ITEMS AS V 
    #Link table containing primary key of AUDIT_ITEMS and AUDIT_CATEGORIES 
    LEFT JOIN AUDIT_ITEM_CATEGORIES AS ic 
    ON V.UUID = ic.ITEM_UUID 
    #Gets category uuid from link table above 
    LEFT JOIN AUDIT_CATEGORIES AS c 
    ON ic.CATEGORY_UUID = c.UUID 
    #Gets the category label/type 
    LEFT JOIN AUDIT_CATEGORY_TYPES AS ct 
    ON c.CATEGORY_TYPE_UUID = ct.UUID 
WHERE TRUE 
#example filter used below 
AND FIND_IN_SET("Errored", @cat_values) > 0 
...etc... 

我曾嘗試:

AND FIND_IN_SET("Errored", (SELECT GROUP_CONCAT(c.category_value))) > 0 

但它似乎慢。

也試過:

HAVING FIND_IN_SET("Errored", GROUP_CONCAT(c.category_value)) > 0 

但必須是基於GROUP_CONCAT值高效篩選結果的方式嗎?

回答

1

您正在尋找having子句條件:

having sum(c.category_value = 'Errored') > 0 

你不需要group_concat()對邏輯的這一部分。

您不明白爲什麼您認爲having會有性能損失。性能命中是在聚合步驟中 - 當您在select中使用group_concat()時,需要此功能。

+0

因爲在查詢後運行has,所以返回完整的一組結果,然後對它進行過濾 – Purgatory 2015-02-06 15:20:25