Mysql: 在没有子查询的情况下使用 GROUP_CONCAT & FIND_IN_SET

Mysql: Using GROUP_CONCAT & FIND_IN_SET in where without having or subquery

您好,我在下面有一个简单的示例查询,这不是我在现实中使用的,因为它太复杂了,无法在此处解释。基本上,此查询用于 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?

中的值有效地过滤结果

您正在 having 子句中查找条件:

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

这部分逻辑不需要 group_concat()

不清楚您为什么认为 having 会降低性能。性能下降是在聚合步骤中——当你在 select.

中使用 group_concat() 时你需要它