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 (
    468398, 468399, 468909, 468929, 468930, 
    468932, 468940, 468943, 468948, 468949, 
    468956, 468964, 469661, 469667, 469722, 
    469723, 469724, 470225, 470233, 470234, 
    470237, 470245, 470251, 470259
  ) 
GROUP BY 
  products_categories.product_id

Query time 0.01046

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 (468398,468399,468909,468929,468930,468932,468940,468943,468948,468949,468956,468964,469661,469667,469722,469723,469724,470225,470233,470234,470237,470245,470251,470259))"
          }
        },
        {
          "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
468398 6649,17422,3M
468399 20,17421,3M
468909 20,17421,3M
468929 20,17421,3M
468930 6649,17422,3M
468932 6649,17422,3M
468940 6649,17422,3M
468943 6649,17422,3M
468948 6649,17422,3M
468949 6649,17422,3M
468956 6649,17422,3M
468964 6649,17422,3M
469661 20,17421,3M
469667 6649,17422,3M
469722 6649,17422,3M
469723 6649,17422,3M
469724 6649,17422,3M
470225 6649,17422,3M
470233 6649,17422,3M
470234 6649,17422,3M
470237 6649,17422,3M
470245 20,17421,3M
470251 6649,17422,3M
470259 6649,17422,3M