diff --git a/app/services/labels/transfer_service.rb b/app/services/labels/transfer_service.rb
index 775efed48eb5ae9d7913d128a2d1fe35b89b401f..9b7486cf53b1fb716b2fbd35743c6d45693ca517 100644
--- a/app/services/labels/transfer_service.rb
+++ b/app/services/labels/transfer_service.rb
@@ -64,9 +64,14 @@ def find_or_create_label!(label)
     end
 
     def update_label_links(labels, old_label_id:, new_label_id:)
-      LabelLink.joins(:label)
-        .merge(labels)
-        .where(label_id: old_label_id)
+      # use 'labels' relation to get label_link ids only of issues/MRs
+      # in the project being transferred.
+      # IDs are fetched in a separate query because MySQL doesn't
+      # allow referring of 'label_links' table in UPDATE query:
+      # https://gitlab.com/gitlab-org/gitlab-ce/-/jobs/62435068
+      link_ids = labels.pluck('label_links.id')
+
+      LabelLink.where(id: link_ids, label_id: old_label_id)
         .update_all(label_id: new_label_id)
     end
 
diff --git a/changelogs/unreleased/label-links-on-project-transfer.yml b/changelogs/unreleased/label-links-on-project-transfer.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fabedb77cb3507bbdecd1de660bd09137430f78e
--- /dev/null
+++ b/changelogs/unreleased/label-links-on-project-transfer.yml
@@ -0,0 +1,5 @@
+---
+title: Fix label links update on project transfer
+merge_request:
+author:
+type: fixed
diff --git a/spec/services/labels/transfer_service_spec.rb b/spec/services/labels/transfer_service_spec.rb
index ae819c011decf23d70a4c490d7c2a33a455d94b3..80bac590a1188b76e2563ed03a3a52252f600efc 100644
--- a/spec/services/labels/transfer_service_spec.rb
+++ b/spec/services/labels/transfer_service_spec.rb
@@ -8,6 +8,7 @@
     let(:group_3) { create(:group) }
     let(:project_1) { create(:project, namespace: group_2) }
     let(:project_2) { create(:project, namespace: group_3) }
+    let(:project_3) { create(:project, namespace: group_1) }
 
     let(:group_label_1) { create(:group_label, group: group_1, name: 'Group Label 1') }
     let(:group_label_2) { create(:group_label, group: group_1, name: 'Group Label 2') }
@@ -23,6 +24,7 @@
       create(:labeled_issue, project: project_1, labels: [group_label_4])
       create(:labeled_issue, project: project_1, labels: [project_label_1])
       create(:labeled_issue, project: project_2, labels: [group_label_5])
+      create(:labeled_issue, project: project_3, labels: [group_label_1])
       create(:labeled_merge_request, source_project: project_1, labels: [group_label_1, group_label_2])
       create(:labeled_merge_request, source_project: project_2, labels: [group_label_5])
     end
@@ -52,5 +54,13 @@
 
       expect(project_1.labels.where(title: group_label_4.title)).to be_empty
     end
+
+    it 'updates only label links in the given project' do
+      service.execute
+
+      targets = LabelLink.where(label_id: group_label_1.id).map(&:target)
+
+      expect(targets).to eq(project_3.issues)
+    end
   end
 end