SELECT 
  products_categories.product_id, 
  GROUP_CONCAT(
    IF(
      products_categories.link_type = "M", 
      CONCAT(
        products_categories.category_id, 
        "M"
      ), 
      products_categories.category_id
    )
  ) AS category_ids 
FROM 
  products_categories 
  INNER JOIN categories ON categories.category_id = products_categories.category_id 
  AND categories.storefront_id IN (0, 1) 
  AND (
    categories.usergroup_ids = '' 
    OR FIND_IN_SET(0, categories.usergroup_ids) 
    OR FIND_IN_SET(1, categories.usergroup_ids)
  ) 
  AND categories.status IN ('A', 'H') 
WHERE 
  products_categories.product_id IN (
    420866, 421406, 421410, 422698, 422708, 
    422755, 422757, 423484, 423498, 424019, 
    424022, 424034, 424035, 424044, 424045, 
    424802, 424804, 424818, 424834, 425367, 
    425372, 425383, 426124, 426133
  ) 
GROUP BY 
  products_categories.product_id

Query time 0.00143

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "39.93"
    },
    "grouping_operation": {
      "using_filesort": false,
      "nested_loop": [
        {
          "table": {
            "table_name": "products_categories",
            "access_type": "range",
            "possible_keys": [
              "PRIMARY",
              "link_type",
              "pt"
            ],
            "key": "pt",
            "used_key_parts": [
              "product_id"
            ],
            "key_length": "3",
            "rows_examined_per_scan": 72,
            "rows_produced_per_join": 72,
            "filtered": "100.00",
            "using_index": true,
            "cost_info": {
              "read_cost": "7.53",
              "eval_cost": "7.20",
              "prefix_cost": "14.73",
              "data_read_per_join": "1K"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ],
            "attached_condition": "(`goimagine`.`products_categories`.`product_id` in (420866,421406,421410,422698,422708,422755,422757,423484,423498,424019,424022,424034,424035,424044,424045,424802,424804,424818,424834,425367,425372,425383,426124,426133))"
          }
        },
        {
          "table": {
            "table_name": "categories",
            "access_type": "eq_ref",
            "possible_keys": [
              "PRIMARY",
              "c_status",
              "p_category_id"
            ],
            "key": "PRIMARY",
            "used_key_parts": [
              "category_id"
            ],
            "key_length": "3",
            "ref": [
              "goimagine.products_categories.category_id"
            ],
            "rows_examined_per_scan": 1,
            "rows_produced_per_join": 3,
            "filtered": "5.00",
            "cost_info": {
              "read_cost": "18.00",
              "eval_cost": "0.36",
              "prefix_cost": "39.93",
              "data_read_per_join": "9K"
            },
            "used_columns": [
              "category_id",
              "usergroup_ids",
              "status",
              "storefront_id"
            ],
            "attached_condition": "((`goimagine`.`categories`.`storefront_id` in (0,1)) and ((`goimagine`.`categories`.`usergroup_ids` = '') or (0 <> find_in_set(0,`goimagine`.`categories`.`usergroup_ids`)) or (0 <> find_in_set(1,`goimagine`.`categories`.`usergroup_ids`))) and (`goimagine`.`categories`.`status` in ('A','H')))"
          }
        }
      ]
    }
  }
}

Result

product_id category_ids
420866 20,17421,3M
421406 6649,17422,3M
421410 20,17421,3M
422698 20,17421,3M
422708 20,17421,3M
422755 20,17421,3M
422757 20,17421,3M
423484 20,17421,3M
423498 20,17421,3M
424019 20,17421,3M
424022 6649,17422,3M
424034 6649,17422,3M
424035 20,17421,3M
424044 20,17421,3M
424045 20,17421,3M
424802 20,17421,3M
424804 20,17421,3M
424818 20,17421,3M
424834 6649,17422,3M
425367 6649,17422,3M
425372 20,17421,3M
425383 6649,17422,3M
426124 20,17421,3M
426133 20,17421,3M