diff --git a/app/jobs/regular/notify_tag_change.rb b/app/jobs/regular/notify_tag_change.rb
index 4b513dd53b7..e503287810c 100644
--- a/app/jobs/regular/notify_tag_change.rb
+++ b/app/jobs/regular/notify_tag_change.rb
@@ -7,23 +7,20 @@ module Jobs
 
       if post&.topic&.visible?
         post_alerter = PostAlerter.new
-        post_alerter.notify_post_users(post, excluded_users(args), include_topic_watchers: !post.topic.private_message?, include_category_watchers: false)
+        post_alerter.notify_post_users(post, User.where(id: args[:notified_user_ids]),
+          group_ids: all_tags_in_hidden_groups?(args) ? tag_group_ids(args) : nil,
+          include_topic_watchers: !post.topic.private_message?,
+          include_category_watchers: false
+        )
         post_alerter.notify_first_post_watchers(post, post_alerter.tag_watchers(post.topic))
       end
     end
 
     private
 
-    def excluded_users(args)
-      if !args[:diff_tags] || !all_tags_in_hidden_groups?(args)
-        return User.where(id: args[:notified_user_ids])
-      end
-      group_users_join = DB.sql_fragment("LEFT JOIN group_users ON group_users.user_id = users.id AND group_users.group_id IN (:group_ids)", group_ids: tag_group_ids(args))
-      condition = DB.sql_fragment("group_users.id IS NULL OR users.id IN (:notified_user_ids)", notified_user_ids: args[:notified_user_ids])
-      User.joins(group_users_join).where(condition)
-    end
-
     def all_tags_in_hidden_groups?(args)
+      return false if args[:diff_tags].blank?
+
       Tag
         .where(name: args[:diff_tags])
         .joins(tag_groups: :tag_group_permissions)
diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb
index 5051070eda3..297a97257dd 100644
--- a/app/services/post_alerter.rb
+++ b/app/services/post_alerter.rb
@@ -651,13 +651,13 @@ class PostAlerter
     emails_to_skip_send
   end
 
-  def notify_post_users(post, notified, include_topic_watchers: true, include_category_watchers: true, include_tag_watchers: true, new_record: false)
+  def notify_post_users(post, notified, group_ids: nil, include_topic_watchers: true, include_category_watchers: true, include_tag_watchers: true, new_record: false)
     return unless post.topic
 
     warn_if_not_sidekiq
 
     condition = +<<~SQL
-      id IN (
+      users.id IN (
         SELECT id FROM users WHERE false
         /*topic*/
         /*category*/
@@ -711,12 +711,16 @@ class PostAlerter
       tag_ids: tag_ids
     )
 
+    if group_ids.present?
+      notify = notify.joins(:group_users).where("group_users.group_id IN (?)", group_ids)
+    end
+
     if post.topic.private_message?
       notify = notify.where(staged: false).staff
     end
 
     exclude_user_ids = notified.map(&:id)
-    notify = notify.where("id NOT IN (?)", exclude_user_ids) if exclude_user_ids.present?
+    notify = notify.where("users.id NOT IN (?)", exclude_user_ids) if exclude_user_ids.present?
 
     DiscourseEvent.trigger(:before_create_notifications_for_users, notify, post)