Список выбора отсутствует в разделе "Группировать по" и содержит неагрегированный столбец - PullRequest
0 голосов
/ 06 августа 2020
    SELECT JSON_OBJECT( 'additionalGroupId', agData.aguid, 'name', 
        agData.name, 'userName', CONCAT(agData.firstname, agData.lastname), 
        'userId', agData.uuid, 'vessel', agData.vessel  ) as data 
    FROM ( SELECT ag.aguid, ag.id, ag.name, u.uuid, 
           u.firstname, u.lastname, 
         ( SELECT JSON_ARRAYAGG( JSON_OBJECT('vesselId', v.vuid, 'vessel', 
           v.vessel, 'imoNumber', v.imoNumber)) FROM vessel v LEFT JOIN 
           additionalgroupvessels agva on agva.vesselId = v.id 
           WHERE agva.additionalGroupId = ag.id ) as vessel FROM additionalgroup 
           ag LEFT JOIN user u ON ag.userId = u.id WHERE ag.isDeleted = false ) agData 
    GROUP BY agData.aguid, agData.name, agData.uuid, agData.vessel;

Это мой запрос, и я столкнулся с ошибкой - Ошибка запроса GET API: ER_WRONG_FIELD_WITH_GROUP: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'agData.firsttname' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

agData.firstname, agData.lastname Нет в вашем GROUP BY, или в простом примере:

Если у вас есть: SELECT a,min(b),c FROM mytable GROUP BY a Вы (должны) получить ту же ошибку, потому что с настройкой ONLY_FULL_GROUP невозможно узнать, хотите ли вы минимальное значение для c, максимальное значение или любое другое агрегированное значение.

Решение состоит в том, чтобы добавить поле c в группу с помощью, ( SELECT a,min(b),c FROM mytable GROUP by a,c)

или добавить агрегированную функцию в поле c. (SELECT a,min(b),avg(c) FROM mytable GROUP BY a)

и, конечно же, у вас также есть возможность изменить настройку sql_mode. Но настройка sql_mode была изменена с Mysql8.0 с определенной целью, поэтому, мой совет, не меняйте это ?

0 голосов
/ 06 августа 2020

Выполните следующую команду в mysql:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...