Синтаксическая ошибка или нарушение прав доступа: 1055 Выражение № 17 в группе по

Я пробовал запрос с использованием группы в laravel 5.3. Я поймал

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 Выражение № 17 списка SELECT не входит в предложение GROUP BY и содержит неагрегированный столбец testtravel.country.name, который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by (SQL:

select  `travel_request`.*, `travel_request`.`id` as `travel_id`,
        `department`.`name` as `dept_name`, `users`.`firstname` as `approver_name`,
        `travel_purpose`.`purpose`, `country`.`name` as `country_name`,
        `traveling_details`.`from_date`, `traveling_details`.`to_date`,
        `travel_request_status`.`status`
    from  `travel_request`
    inner join  `department`  ON `travel_request`.`department_id` = `department`.`id`
    inner join  `users`  ON `travel_request`.`approver_id` = `users`.`id`
    inner join  `travel_purpose`  ON `travel_request`.`travel_purpose_id` = `travel_purpose`.`id`
    inner join  `traveling_details`  ON `travel_request`.`id` = `traveling_details`.`travel_request_id`
    inner join  `country`  ON `country`.`id` = `traveling_details`.`country_id`
    inner join  `travel_request_status`  ON `travel_request`.`status_id` = `travel_request_status`.`id`
    where  `travel_request`.`approver_id` = 187
      and  `travel_request`.`status_id` != 4
    group by  `travel_request`.`id`
    limit  2 offset 0)

Я скопировал запрос и запустил в sql. Он хорошо работает в mysql. Я пробовал как

 $users = DB::table('travel_request')
        ->join('department', 'travel_request.department_id', '=', 'department.id')
        ->join('users', 'travel_request.approver_id', '=', 'users.id')
        ->join('travel_purpose', 'travel_request.travel_purpose_id', '=', 'travel_purpose.id')
        ->join('traveling_details', 'travel_request.id','=','traveling_details.travel_request_id' )
        ->join('country','country.id', '=', 'traveling_details.country_id')
        ->join('travel_request_status','travel_request.status_id', '=', 'travel_request_status.id')
        ->select('travel_request.*', 'travel_request.id as travel_id','department.name as dept_name','users.firstname as approver_name','travel_purpose.purpose','country.name as country_name','traveling_details.from_date','traveling_details.to_date','travel_request_status.status')->where('travel_request.approver_id', $user_id)->where('travel_request.status_id','!=','4')->GROUPBY ('travel_request.id')->paginate(2);

Решено

Однако, чтобы отключить это, просто перейдите в config / database.php и измените строгий флаг.

'mysql' => [
            .
            .
            .
            'strict' => false,
            //'strict' => true,
            .
            .
        ],

person user3386779    schedule 28.10.2016    source источник


Ответы (3)


Откройте ваш config/database.php файл и измените mysql массив конфигурации следующим образом:

с 'strict' => true

to 'strict' => false

Прочтите этот ответ для получения дополнительной информации об ошибке.

person Amit Gupta    schedule 19.12.2016

Вы не используете функцию агрегации, поэтому, возможно, вы используете group by для упорядочивания результата (или для получения отдельного значения), начиная с mysql 5.6, использование группы только путем указания всего столбца, задействованного для группы, и невозможно частичное Технические характеристики.

Также запрещено использование group by для упорядочивания.

поэтому, если вы используете для заказа, используйте правильный порядок вместо группы по

  select 
        `travel_request`.*
      , `travel_request`.`id` as `travel_id`
      , `department`.`name` as `dept_name`
      , `users`.`firstname` as `approver_name`
      , `travel_purpose`.`purpose`
      , `country`.`name` as `country_name`
      , `traveling_details`.`from_date`
      , `traveling_details`.`to_date`
      , `travel_request_status`.`status` 
  from `travel_request` 
  inner join `department` on `travel_request`.`department_id` = `department`.`id` 
  inner join `users` on `travel_request`.`approver_id` = `users`.`id` 
  inner join `travel_purpose` on `travel_request`.`travel_purpose_id` = `travel_purpose`.`id` 
  inner join `traveling_details` on `travel_request`.`id` = `traveling_details`.`travel_request_id` 
  inner join `country` on `country`.`id` = `traveling_details`.`country_id` 
  inner join `travel_request_status` on `travel_request`.`status_id` = `travel_request_status`.`id` 
  where `travel_request`.`approver_id` = 187 and `travel_request`.`status_id` != 4 
  order by `travel_request`.`id` limit 2 offset 0)

это поведение контролируется sql_mode=only_full_group_by, вы можете изменить этот параметр для использования старого поведения https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

person scaisEdge    schedule 28.10.2016

это решение и работает правильно :) Откройте терминал и

sudo mysql -uroot -ppassword

И измените режим SQL для вашего экземпляра сервера MySQL:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
person Mostafa Mahmoud    schedule 07.06.2021