Поскольку в предложении WHERE
указано значение article_id
, нет реальной необходимости позволять предложению select
возвращать его.Лучше удалить его, также потому что он не соответствует стандартам SQL, которые говорят, что если у вас есть агрегирование (group_concat
), все неагрегирующие выражения в предложении select
должны быть в предложении group by
.Но выполнение этого (как в первой версии вашего вопроса) дало бы некоторые издержки.Так что лучше удалите его.
Поскольку условие WHERE
относится к первичному ключу и вам не нужны никакие данные из таблицы articles_test
, вы можете опустить таблицу articles_test
и поместить WHERE
вместо этого используется условие для внешних ключей.
Наконец, существует своего рода декартово соединение, поскольку вы комбинируете каждое попадание в attr_f
с каждым попаданием в attr_n
.Это может привести к появлению некоторых дубликатов в выходных данных group_concat
и представляет собой снижение производительности.
Если все эти дубликаты удаляются, то, возможно, вы добьетесь лучшей производительности, разбив запрос на группы:один для выхода function , один для разного выхода.Затем группа формируется из attr_group_id
.
. Это также позволит превратить внешние объединения во внутренние объединения.
Таким образом, результатом будет непроверенная версия того, что вы искали:
SELECT attr.attr_group_id, GROUP_CONCAT(cat.attr_de) AS functions
FROM articles_attr AS attr
INNER JOIN cat_attr AS cat ON cat.attr_id = attr.attr_id
WHERE attr.article_id = 11
AND attr.attr_group_id IN (26, 27)
GROUP BY attr.attr_group_id
Итак, теперь вывод будет состоять из двух строк.В том, что в первом столбце указано 26, во втором столбце перечислены функции, а в первом столбце - 27.
Правда, формат вывода другой, но я думаю, что вы это сделаете.быть в состоянии переделать код, который использует этот запрос, извлекая выгоду из увеличения производительности (что я ожидаю).
Если вам нужна сводная версия, используйте выражение case when
:
SELECT GROUP_CONCAT(CASE attr.attr_group_id WHEN 26 THEN cat.attr_de END) AS functions,
GROUP_CONCAT(CASE attr.attr_group_id WHEN 27 THEN cat.attr_de END) AS miscellaneous
FROM articles_attr AS attr
INNER JOIN cat_attr AS cat ON cat.attr_id = attr.attr_id
WHERE attr.article_id = 11
AND attr.attr_group_id IN (26, 27)