2016-03-05 2 views
1

donc je mets à jour une table qui est fonctionnellement équivalent à:MySQL: mise à jour avec JOIN en utilisant GROUP_CONCAT: ERREUR 1111 (HY000): Utilisation incorrecte de la fonction de groupe

create table NODE(
    group_name varchar(100) not null, 
    full_name varchar(100) not null, 
    dependency longtext, 
    is_top ENUM('0','1') not null default 0, 
    ... 
); 

La dépendance est une concaténation du full_name de tous les autres nœuds qui se déclenchent quand quelque chose arrive à ce nœud qui a besoin de descendre jusqu'aux nœuds ancêtres. Il existe un nœud de niveau supérieur dont tous sont des «enfants». Parfois, un groupe de plus est ajouté au groupe et j'ai besoin de mettre à jour le dependency du nœud de niveau supérieur avec full_names des autres nœuds enfants en tant que chaîne géante séparée par '&'.

Voici était ma requête:

update NODE n1 
join NODE n2 
on n2.group_name=n1.group_name 
set n1.dependency=GROUP_CONCAT(n2.full_name SEPARATOR '&') 
where n1.is_top='1' and n2.is_top='0' and n1.group_name='MY GROUP NAME'; 

erreur:

ERROR 1111 (HY000): Invalid use of group function 

Ma compréhension est ce qui devrait être bien, vous pouvez, après tout utiliser GROUP_CONCAT dans une instruction select, et je le fais tout le temps, je ne comprends pas comment cela est invalide.

pour les curieux: je n'ai pas conçu cette base de données, et oui j'ai renommé des choses pour cacher la vraie nature de la base de données et comment cela fonctionne.

Répondre

2

Essayez quelque chose comme ceci:

update NODE n1 
join 
(
    SELECT 
     GROUP_CONCAT(full_name SEPARATOR '&') as name_concat, 
     group_name 
    FROM NODE 
    WHERE 
     is_top='0' 
    GROUP BY group_name 
) n2 
ON n2.group_name=n1.group_name 
SET n1.dependency=n2.name_concat 
WHERE 
    n1.is_top='1' and 
    n1.group_name='MY GROUP NAME'; 

Vous ne devriez pas utiliser GROUP_CONCAT sans GROUP BY.

+0

Merci! J'ai dû faire un petit montage pour sortir le n2.full_name dans GROUP_CONCAT et le remplacer par le nom complet mais c'était parfait! Je me demande pourquoi cela doit être fait de cette façon. –

+1

@jasondancks, oups! celui-là a glissé. J'ai mis à jour ma réponse de toute façon. Heureux d'avoir pu aider! –