Привет, у меня есть простой пример запроса ниже, который я не использую в реальности, поскольку он слишком сложен, чтобы объяснять здесь. В основном этот запрос используется при поиске в веб-приложении.
Из-за объема данных, которые этот запрос может быть извлечен, я стараюсь избегать использования HAVING или подзапросов, поскольку это резко увеличивает время, необходимое для извлечения данных.
Я хочу использовать FIND_IN_SET в предложении where, но, очевидно, 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
будет иметь снижение производительности. Повышение производительности происходит на этапе агрегации, который вам нужен при использовании group_concat()
в select
,
Других решений пока нет …