J'essaie de mettre à jour la valeur d'une colonne dans un groupe de lignes dans une table en utilisant UPDATE. Le problème est que j'ai besoin d'utiliser une sous-requête pour dériver la valeur de cette colonne, et cela dépend de la même table. Voici la requête:SQL UPDATE avec sous-requête qui fait référence à la même table dans MySQL
UPDATE user_account student
SET student.student_education_facility_id = (
SELECT teacher.education_facility_id
FROM user_account teacher
WHERE teacher.user_account_id = student.teacher_id AND teacher.user_type = 'ROLE_TEACHER'
)
WHERE student.user_type = 'ROLE_STUDENT';
Habituellement, si l'enseignant et l'élève se trouvaient dans deux tables différentes, mysql ne s'en plaindrait pas. Mais comme ils sont tous les deux utilisent la même table, mysql vomit cette erreur à la place:
erreur 1093 (HY000): Vous ne pouvez pas spécifier la table cible « étudiant » pour la mise à jour dans la clause FROM
est-il de toute façon je peux forcer mysql à faire la mise à jour? Je suis 100% positif la clause from ne sera pas affectée car les lignes sont mises à jour.
Sinon, y a-t-il un autre moyen d'écrire cette mise à jour SQL pour obtenir le même effet?
Merci!
EDIT: Je pense que je l'ai eu à travailler:
UPDATE user_account student
LEFT JOIN user_account teacher ON teacher.user_account_id = student.teacher_id
SET student.student_education_facility_id = teacher.education_facility_id
WHERE student.user_type = 'ROLE_STUDENT';
Ce serait bien s'il y avait deux solutions: le spécifique et l'un un peu plus abstrait, avec plus clairs noms de table et de colonne, pour simplifier la lecture pour les personnes à la recherche pour une réponse générale, comme moi.En tout cas, la question et la réponse me satisfont, mais je le suggérais pour une meilleure compréhension de la communauté. Merci, et +1 aux deux – Nico
Tout à fait d'accord avec @Nico à ce sujet. C'est pourquoi j'ai fourni un exemple abstrait avec des noms de colonnes et de tables plus clairs (http://stackoverflow.com/a/23772515/886539). J'ai également mis à jour la réponse de John Hartsock (m'a aidé beaucoup à créer mon exemple). –