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 (
    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.00110

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "37.70"
    },
    "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": 68,
            "rows_produced_per_join": 68,
            "filtered": "100.00",
            "using_index": true,
            "cost_info": {
              "read_cost": "7.10",
              "eval_cost": "6.80",
              "prefix_cost": "13.90",
              "data_read_per_join": "1K"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ],
            "attached_condition": "(`goimagine`.`products_categories`.`product_id` in (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": 3,
            "filtered": "5.00",
            "cost_info": {
              "read_cost": "17.00",
              "eval_cost": "0.34",
              "prefix_cost": "37.70",
              "data_read_per_join": "8K"
            },
            "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
296842 71,22116,22126,2566M
296845 73,22116,22126,2566M
296847 87,22118,22126,2566M
296851 73,22116,22126,2566M
296857 73,22116,22126,2566M
296860 73,22116,22126,2566M
296862 73,22116,22126,2566M
296864 73,22116,22126,2566M
296868 73,22116,22126,2566M
296872 73,22120,22126,2566M
296875 73,22116,22126,2566M
296876 73,22116,22126,2566M
296882 73,22116,22126,2566M
296895 73,22116,22126,2566M
296900 73,22116,22126,2566M
296906 73,22116,22126,2566M
296917 73,22116,22126,2566M