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 (
    296873, 296839, 296831, 296893, 296928, 
    296832, 296841, 296919, 296881, 296861, 
    296883, 296838, 296848, 296853, 296899, 
    296846, 296833, 296858, 296886, 296894, 
    296835, 296869, 296892, 296837, 296845, 
    296895, 296864, 296917, 296851, 296862, 
    296872, 296882, 296900, 296875, 296847, 
    296876, 296906, 296860, 296868, 296857, 
    296842
  ) 
GROUP BY 
  products_categories.product_id

Query time 0.00171

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "90.57"
    },
    "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": 164,
            "rows_produced_per_join": 164,
            "filtered": "100.00",
            "using_index": true,
            "cost_info": {
              "read_cost": "16.77",
              "eval_cost": "16.40",
              "prefix_cost": "33.17",
              "data_read_per_join": "2K"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ],
            "attached_condition": "(`goimagine`.`products_categories`.`product_id` in (296873,296839,296831,296893,296928,296832,296841,296919,296881,296861,296883,296838,296848,296853,296899,296846,296833,296858,296886,296894,296835,296869,296892,296837,296845,296895,296864,296917,296851,296862,296872,296882,296900,296875,296847,296876,296906,296860,296868,296857,296842))"
          }
        },
        {
          "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": 8,
            "filtered": "5.00",
            "cost_info": {
              "read_cost": "41.00",
              "eval_cost": "0.82",
              "prefix_cost": "90.57",
              "data_read_per_join": "21K"
            },
            "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
296831 73,22122,22126,2566M
296832 73,22122,22126,2566M
296833 73,22122,22126,2566M
296835 73,22122,22126,2566M
296837 73,22118,22126,2566M
296838 73,22116,22126,2566M
296839 73,22116,22126,2566M
296841 73,22116,22126,2566M
296842 71,22116,22126,2566M
296845 73,22116,22126,2566M
296846 73,22116,22126,2566M
296847 87,22118,22126,2566M
296848 87,22118,22126,2566M
296851 73,22116,22126,2566M
296853 73,22116,22126,2566M
296857 73,22116,22126,2566M
296858 73,22116,22126,2566M
296860 73,22116,22126,2566M
296861 73,22116,22126,2566M
296862 73,22116,22126,2566M
296864 73,22116,22126,2566M
296868 73,22116,22126,2566M
296869 73,22116,22126,2566M
296872 73,22120,22126,2566M
296873 73,22116,22126,2566M
296875 73,22116,22126,2566M
296876 73,22116,22126,2566M
296881 73,22116,22126,2566M
296882 73,22116,22126,2566M
296883 73,22116,22126,2566M
296886 6649,22119,22126,2566M
296892 6724,22116,22126,2566M
296893 73,22116,22126,2566M
296894 73,22116,22126,2566M
296895 73,22116,22126,2566M
296899 73,22116,22126,2566M
296900 73,22116,22126,2566M
296906 73,22116,22126,2566M
296917 73,22116,22126,2566M
296919 73,22116,22126,2566M
296928 73,22122,22126,2566M