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