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 (
    485527, 486065, 486066, 486082, 486118, 
    486845, 487406, 488152, 488190, 490052, 
    490066, 490069, 490082, 490790, 490803, 
    490831, 491353, 491365, 491401, 492704, 
    494032, 494761, 494792, 494802
  ) 
GROUP BY 
  products_categories.product_id

Query time 0.00477

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "39.91"
    },
    "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.51",
              "eval_cost": "7.20",
              "prefix_cost": "14.71",
              "data_read_per_join": "1K"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ],
            "attached_condition": "(`goimagine`.`products_categories`.`product_id` in (485527,486065,486066,486082,486118,486845,487406,488152,488190,490052,490066,490069,490082,490790,490803,490831,491353,491365,491401,492704,494032,494761,494792,494802))"
          }
        },
        {
          "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.91",
              "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
485527 20,17421,3M
486065 6649,17422,3M
486066 6649,17422,3M
486082 6649,17422,3M
486118 6649,17422,3M
486845 20,17421,3M
487406 20,17421,3M
488152 20,17421,3M
488190 20,17421,3M
490052 6649,17422,3M
490066 6649,17422,3M
490069 6649,17422,3M
490082 6649,17422,3M
490790 6649,17422,3M
490803 6649,17422,3M
490831 20,17421,3M
491353 6649,17422,3M
491365 20,17421,3M
491401 20,17421,3M
492704 6649,17422,3M
494032 20,17421,3M
494761 6649,17422,3M
494792 20,17421,3M
494802 6649,17422,3M