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 (
    470272, 470273, 470284, 470991, 470993, 
    471010, 471014, 471037, 471041, 471582, 
    471588, 472325, 472332, 472333, 472341, 
    472349, 472360, 472361, 472867, 472876, 
    472882, 472883, 472890, 472891
  ) 
GROUP BY 
  products_categories.product_id

Query time 0.00121

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 (470272,470273,470284,470991,470993,471010,471014,471037,471041,471582,471588,472325,472332,472333,472341,472349,472360,472361,472867,472876,472882,472883,472890,472891))"
          }
        },
        {
          "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
470272 20,17421,3M
470273 20,17421,3M
470284 6649,17422,3M
470991 20,17421,3M
470993 6649,17422,3M
471010 6649,17422,3M
471014 20,17421,3M
471037 20,17421,3M
471041 20,17421,3M
471582 20,17421,3M
471588 6649,17422,3M
472325 20,17421,3M
472332 6649,17422,3M
472333 6649,17422,3M
472341 6649,17422,3M
472349 6649,17422,3M
472360 20,17421,3M
472361 20,17421,3M
472867 6649,17422,3M
472876 6649,17422,3M
472882 6649,17422,3M
472883 6649,17422,3M
472890 6649,17422,3M
472891 6649,17422,3M