Я получаю «Код ошибки: 1111. Недопустимое использование групповой функции» при попытке свернуть 3 дочерние таблицы в столбец JSON в родительском столбце.
Я знаю, что это кардинальный грех против правила нормализации всего, но это то, что мне нужно.
У меня есть 4 таблицы:
CREATE TABLE `requirement_categories` (
`requirement_category` varchar(128) NOT NULL,
PRIMARY KEY (`requirement_category`),
UNIQUE KEY `category_UNIQUE` (`requirement_category`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `requirement_groups` (
`requirement_group` varchar(128) NOT NULL,
`requirement_category` varchar(128) DEFAULT NULL,
PRIMARY KEY (`requirement_group`),
KEY `fk_requirement_caregory_idx` (`requirement_category`),
CONSTRAINT `fk_requirement_caregory` FOREIGN KEY
(`requirement_category`) REFERENCES `requirement_categories`
(`requirement_category`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `requirement_subgroups` (
`group_id` varchar(64) DEFAULT NULL,
`requirement_subgroup` varchar(128) NOT NULL,
`description` text,
`requirement_group` varchar(128) DEFAULT NULL,
PRIMARY KEY (`requirement_subgroup`),
KEY `fk_requirement_group_idx` (`requirement_group`),
CONSTRAINT `fk_requirement_group` FOREIGN KEY
(`requirement_group`) REFERENCES `requirement_groups`
(`requirement_group`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `requirements` (
`requirement` varchar(256) NOT NULL,
`description` text,
`requirements_subgroup` varchar(128) NOT NULL,
PRIMARY KEY (`requirement`,`requirements_subgroup`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Мой запрос следующий:
SELECT
rc.requirement_category,
JSON_OBJECT('requirement_group',
rg.requirement_group,
'requirement_subgroup',
JSON_ARRAYAGG(JSON_OBJECT('requirement_subgroup',
rsg.requirement_subgroup,
'description',
rsg.description,
'requirements',
JSON_ARRAYAGG(JSON_OBJECT('requirement',
rs.requirement,
'description',
rs.description))))) AS
requirement
FROM
jobdesc_jdc.requirement_categories rc
LEFT JOIN
requirement_groups rg ON rg.requirement_category =
rc.requirement_category
LEFT JOIN
requirement_subgroups rsg ON rsg.requirement_group =
rg.requirement_group
LEFT JOIN
requirements rs ON rs.requirements_subgroup =
rsg.requirement_subgroup
GROUP BY rg.requirement_category
Делая это постепенно, все в порядке, пока я не добавлю последнюю функцию JSON_OBJECT (которая появляется первой в запросе), и я могу получить набор результатов с категорией в первом столбце, группой во втором и JSON-объекте Подводя итог остальным. Мне нужно иметь только два столбца: категорию в первом и объект JSON во втором.
Я был бы признателен за любой свет, который можно было бы пролить на это - я искал все выше и ниже и тратил на это часы.
С уважением,
Will.