0

嗨,我在下面有一个简单的示例查询,这不是我在现实中使用的,因为它太复杂了,无法在这里解释。基本上,此查询用于 Web 应用程序中的搜索。

由于此查询可能提取的数据量很大,我试图避免使用 HAVING 或子查询,因为它大大增加了检索数据所需的时间。

我想在 where 子句中使用 FIND_IN_SET,但显然 GROUP_CONCAT 不能在 where 子句中使用,所以我尝试像下面这样简单,但我不认为变量设置在 where 并且没有返回结果。

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 中的值有效地过滤结果?

4

1 回答 1

1

您正在寻找having子句中的条件:

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

您不需要group_concat()这部分逻辑。

目前尚不清楚您为什么认为这having会降低性能。性能损失出现在聚合步骤中 - 当您group_concat()select.

于 2015-02-05T17:48:06.790 回答