2017-03-16 1 views
-1

Je viens de mettre à jour MySQL vers la version 5.7.17 en raison du support JSON. Certains changements dans le projet ont nécessité cette mise à niveau. Une seule requête SQL ne fonctionne pas comme prévu. Je reçois une erreur: ER_WRONG_FIELD_WITH_GROUPRequête SQL dans MySQL 5.7.17

Je l'ai googlé, et la plupart des réponses ont été: Désactiver ONLY_FULL_GROUP_BY en mode sql. Mais cela ne fait que résoudre le problème au lieu de le résoudre. Corrige moi si je me trompe.

My SQL qui donne des problèmes:

SELECT users.*, 
     GROUP_CONCAT(d_user_link.public_key ORDER BY d_user_link.id) AS linked_devices, 
     permission_users.group_id, 
     permission_users.custom_permissions, 
     permission_groups.group_name, 
     permission_groups.group_permissions 
FROM users 
INNER JOIN permission_users 
    ON permission_users.user_id = users.id 
INNER JOIN permission_groups 
    ON permission_groups.id = permission_users.group_id 
LEFT JOIN d_user_link 
    ON d_user_link.user_id = users.id 
    AND d_user_link.disabled = 0 
WHERE users.id = ? 
GROUP BY users.id 

Le d_user_link n'a pas pour tous les utilisateurs, parce que certains utilisateurs peuvent voir tous les appareils (d_user_link est périphérique utilisateur-link), ou ne pas avoir des périphériques liés.

J'espère que vous pouvez m'aider avec ce problème. Je ne pouvais pas obtenir une réponse en googling autre que cette désactivation ONLY_FULL_GROUP_BY.

Merci!

+3

double possible de [MySQL: est pas GROUP BY] (http://stackoverflow.com/questions/25800411/mysql-isnt-in-group-by) – Shadow

+0

'users.id' apparaît deux fois dans votre select, une fois dans' users. * 'et encore comme' user_group_id'. Ce n'est pas le seul problème, btw – JohnHC

+0

Ah, c'était à des fins de test. Il n'est plus dans la requête @JohnHC. Merci! Quels problèmes voyez-vous? –

Répondre

0

Le problème fondamental de cette requête concerne les autorisations. Dans les versions antérieures de MySQL, votre requête renvoyait une ligne par utilisateur avec des autorisations arbitraires. Autrement dit, il a arbitrairement abandonné les autorisations pour un utilisateur. Je considérerais ceci comme un bug.

Cela rend la mise à niveau de la requête difficile.

Lorsque vous ajoutez des autorisations au group by, vous obtenez plusieurs lignes par utilisateur. Ce n'est probablement pas l'intention. Une option consiste à supprimer entièrement les autorisations de la requête. Une autre est de les regrouper:

SELECT u.*, 
     GROUP_CONCAT(ul.public_key ORDER BY ul.id) AS linked_devices, 
     GROUP_CONCAT(pu.group_id ORDER BY pu.group_id) as group_ids, 
     GROUP_CONCAT(pu.custom_permissions ORDER BY pu.group_id) as custom_permissions, 
     GROUP_CONCAT(pg.group_name ORDER BY pu.group_id) as group_name, 
     GROUP_CONCAT(pg.group_permissions ORDER BY pu.group_id) as group_permissions 
FROM users u INNER JOIN 
    permission_users pu 
    ON pu.user_id = u.id INNER JOIN 
    permission_groups pg 
    ON pg.id = pu.group_id LEFT JOIN 
    d_user_link ul 
    ON ul.user_id = u.id AND ul.disabled = 0 
WHERE u.id = ? ; 
+0

Merci pour le SQL! Cela fonctionne comme prévu. Seule la faute de frappe est que vous avez utilisé 'dl' dans le premier groupe_concat, mais que vous l'avez défini comme' ul' plus tard dans le sql. Impossible de l'éditer à cause de 6 caractères minimum. La permission_groups a seulement 1 ligne pour chaque utilisateur, donc ce n'était pas un problème pour moi. Je vais utiliser ce SQL à partir de maintenant. –