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 (
    241402, 242084, 238468, 238494, 238463, 
    238437, 238479, 238471, 238457, 238445, 
    238472, 238453, 238444, 238475, 238446, 
    238461, 238465, 238470, 238487, 238492, 
    238440, 238481, 238486, 238467, 238484, 
    238460, 238462, 238477, 238490, 238489, 
    238447, 238485, 238443, 238495, 238448, 
    238442, 238438, 238493, 238454, 238488, 
    238449, 238441, 238480, 238458, 238482, 
    238483, 238439, 238464
  ) 
GROUP BY 
  products_categories.product_id

Query time 0.00200

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "103.20"
    },
    "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": 187,
            "rows_produced_per_join": 187,
            "filtered": "100.00",
            "using_index": true,
            "cost_info": {
              "read_cost": "19.05",
              "eval_cost": "18.70",
              "prefix_cost": "37.75",
              "data_read_per_join": "2K"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ],
            "attached_condition": "(`goimagine`.`products_categories`.`product_id` in (241402,242084,238468,238494,238463,238437,238479,238471,238457,238445,238472,238453,238444,238475,238446,238461,238465,238470,238487,238492,238440,238481,238486,238467,238484,238460,238462,238477,238490,238489,238447,238485,238443,238495,238448,238442,238438,238493,238454,238488,238449,238441,238480,238458,238482,238483,238439,238464))"
          }
        },
        {
          "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": 9,
            "filtered": "5.00",
            "cost_info": {
              "read_cost": "46.75",
              "eval_cost": "0.94",
              "prefix_cost": "103.20",
              "data_read_per_join": "24K"
            },
            "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
238437 267,16543,2566M
238438 267,16543,2566M
238439 291,16556,2566M
238440 291,16556,2566M
238441 291,16556,2566M
238442 291,16556,2566M
238443 291,16556,2566M
238444 291,16556,2566M
238445 291,16552,2566M
238446 77,16544,16558,2566M
238447 77,16544,16549,16558,2566M
238448 262,16545,16549,16555,16559,2566M
238449 114,16548,16550,16558,2566M
238453 262,16545,16552,16555,2566M
238454 262,16545,16555,16559,2566M
238457 52,16558,2566M
238458 16556,2566M
238460 262,16545,16555,16559,2566M
238461 262,16545,16549,16555,16559,2566M
238462 262,16545,16555,16559,2566M
238463 6726,16549,16551,16559,2566M
238464 291,16556,2566M
238465 262,16545,16555,16559,2566M
238467 291,16551,16559,2566M
238468 291,16550,16559,2566M
238470 291,16550,16559,2566M
238471 56,16547,16560,2566M
238472 291,16551,16559,2566M
238475 267,16554,16555,16558,2566M
238477 288,16550,16558,2566M
238479 291,16557,2566M
238480 323,16548,16558,2566M
238481 291,16554,16555,16557,2566M
238482 16547,16550,16558,2566M
238483 262,16544,16545,16555,2566M
238484 77,16544,16558,2566M
238485 291,16551,16559,2566M
238486 323,16548,16559,16560,2566M
238487 267,16554,2566M
238488 291,16551,2566M
238489 291,16552,2566M
238490 77,16544,16558,2566M
238492 267,16554,2566M
238493 291,16551,2566M
238494 291,16551,2566M
238495 26,16549,16558,2566M
241402 16550,16558,321M
242084 16543,16552,16555,267M