Negezor
@Negezor
Senior Shaurma Developer

Как улучшить запрос?

Доброе время суток, появилась проблема у меня генерируется вот такой запрос:
SELECT `g`.`id` AS `groupId`,
       `g`.`name` AS `groupName`,
       GROUP_CONCAT(DISTINCT r.name SEPARATOR ",") AS ROLES
FROM
  (SELECT `u`.`user` AS `user`,
          `u`.`gid` AS `gid`,
          `ru`.`id` AS `role`
   FROM `users` AS `u`
   LEFT JOIN `roles_users` AS `ru` ON `u`.`user` = ?
   AND `ru`.`user` = `u`.`id`
   UNION SELECT `u`.`user` AS `user`,
                `u`.`gid` AS `gid`,
                `rg`.`id` AS `role`
   FROM `users` AS `u`
   LEFT JOIN `roles_groups` AS `rg` ON `u`.`user` = ?
   AND `rg`.`gid` = `u`.`gid`) AS `ur`
INNER JOIN `groups` AS `g` ON `g`.`id` = `ur`.`gid`
LEFT JOIN `roles` AS `r` ON `r`.`id` = `ur`.`role`
LIMIT 1

Но он завешается ошибок:

ER_MIX_OF_GROUP_FUNC_AND_FIELDS: In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'base.g.id'; this is incompatible with sql_mode=only_full_group_by

Проблема вроде как решается если я добавляю GROUP BY `g`.`id`, но я не понимаю зачем нужно делать группировку?
Cама структура таблиц такая DBDesigner.
Заранее спасибо)
  • Вопрос задан
  • 555 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `u`.`gid` AS `group_id`,
       `g`.`name` AS `group_name`,
       GROUP_CONCAT(DISTINCT `r`.`name` SEPARATOR ",") AS roles,
  FROM (
    SELECT `u`.`user` AS `user`, `u`.`gid` AS `gid`, `ru`.`id` AS `role` 
      FROM `users` AS `u`
      LEFT JOIN `roles_users` AS `ru` 
        ON `u`.`user` = :user_id AND `ru`.`user` = `u`.`user`
    UNION SELECT `u`.`user` AS `user`, `u`.`gid` AS `gid`, `rg`.`id` AS `role` 
      FROM `users` AS `u`
      LEFT JOIN `roles_groups` AS `rg` 
        ON `u`.`user` = :user_id AND `rg`.`gid` = `u`.`gid` 
  ) AS `ur`  
  INNER JOIN `groups` AS `g` ON `g`.`id` = `ur`.`gid`
  LEFT JOIN `roles` AS `r` ON `r`.`id` = `ur`.`role`
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы