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 (
    385788, 385792, 386515, 386529, 386536, 
    386546, 386549, 387058, 387081, 387083, 
    387085, 387120, 387867, 388404, 389711, 
    389713, 389714, 389715, 389730, 390516, 
    390517, 391044, 391788, 391796
  ) 
GROUP BY 
  products_categories.product_id

Query time 0.00132

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 (385788,385792,386515,386529,386536,386546,386549,387058,387081,387083,387085,387120,387867,388404,389711,389713,389714,389715,389730,390516,390517,391044,391788,391796))"
          }
        },
        {
          "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
385788 20,17421,3M
385792 20,17421,3M
386515 20,17421,3M
386529 20,17421,3M
386536 6649,17422,3M
386546 20,17421,3M
386549 20,17421,3M
387058 20,17421,3M
387081 20,17421,3M
387083 20,17421,3M
387085 20,17421,3M
387120 6649,17422,3M
387867 20,17421,3M
388404 20,17421,3M
389711 6649,17422,3M
389713 6649,17422,3M
389714 6649,17422,3M
389715 20,17421,3M
389730 20,17421,3M
390516 20,17421,3M
390517 20,17421,3M
391044 20,17421,3M
391788 20,17421,3M
391796 20,17421,3M