«Код ошибки: 1111. Неправильное использование групповой функции» с функциями JSON - PullRequest
0 голосов
/ 04 ноября 2018

Я получаю «Код ошибки: 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.

1 Ответ

0 голосов
/ 05 ноября 2018

По счастливой случайности и отчаянию я заставил его работать. Я вложил работающий этап, объединив дочерние таблицы и таблицы внуков в столбец JSON, в представление, а затем использовал его в качестве дочернего для конечного родителя.

    SELECT 
      requirement_category,
      JSON_ARRAYAGG(JSON_OBJECT(requirement_group, requirement)) as requirements
    FROM
        (SELECT 
          rc.requirement_category,
          rg.requirement_group,
          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
              JOIN requirement_groups rg ON rg.requirement_category = rc.requirement_category
              JOIN requirement_subgroups rsg ON rsg.requirement_group = rg.requirement_group
              JOIN requirements rs ON rs.requirements_subgroup = rsg.requirement_subgroup
              GROUP BY rc.requirement_category , rg.requirement_group
        ) v1
    GROUP BY requirement_category
...