Mysql:使用GROUP_CONCAT& FIND_IN_SET在没有或子查询的地方

时间:2015-02-05 17:44:32

标签: php mysql sql find-in-set

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

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

我想在where子句中使用FIND_IN_SET,但显然GROUP_CONCAT不能在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中的值有效地过滤结果吗?

1 个答案:

答案 0 :(得分:1)

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

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

这部分逻辑不需要group_concat()

目前还不清楚为什么你认为having会有性能损失。性能影响在聚合步骤中 - 当您在group_concat()中使用select时,您需要这样做。