Mysql: использование GROUP_CONCAT & amp; FIND_IN_SET в где без наличия или подзапроса

Привет, у меня есть простой пример запроса ниже, который я не использую в реальности, поскольку он слишком сложен, чтобы объяснять здесь. В основном этот запрос используется при поиске в веб-приложении.

Из-за объема данных, которые этот запрос может быть извлечен, я стараюсь избегать использования 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?

0

Решение

Вы ищете условное в having пункт:

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

Вам не нужно group_concat() для этой части логики.

Непонятно, почему вы так думаете having будет иметь снижение производительности. Повышение производительности происходит на этапе агрегации, который вам нужен при использовании group_concat() в select,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]