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 (
    296884, 296840, 296925, 296885, 296815, 
    296844, 296874, 296922, 296903, 296924, 
    296930, 296843, 296902, 296910, 296891, 
    296863, 296923, 296850, 296887, 296816, 
    296916, 296813, 296856, 296854, 296901, 
    296878, 296871, 296867, 296879, 296918, 
    296870, 296855, 296866, 296896, 296812, 
    296824, 296915, 296865, 296898, 296877, 
    296907, 296920, 296889, 296921, 296926, 
    296849, 296814, 296859
  ) 
GROUP BY 
  products_categories.product_id

Query time 0.00186

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "105.40"
    },
    "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": 191,
            "rows_produced_per_join": 191,
            "filtered": "100.00",
            "using_index": true,
            "cost_info": {
              "read_cost": "19.46",
              "eval_cost": "19.10",
              "prefix_cost": "38.56",
              "data_read_per_join": "2K"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ],
            "attached_condition": "(`goimagine`.`products_categories`.`product_id` in (296884,296840,296925,296885,296815,296844,296874,296922,296903,296924,296930,296843,296902,296910,296891,296863,296923,296850,296887,296816,296916,296813,296856,296854,296901,296878,296871,296867,296879,296918,296870,296855,296866,296896,296812,296824,296915,296865,296898,296877,296907,296920,296889,296921,296926,296849,296814,296859))"
          }
        },
        {
          "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": "47.75",
              "eval_cost": "0.96",
              "prefix_cost": "105.41",
              "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
296812 73,22116,22126,2566M
296813 71,22116,22126,2566M
296814 22116,22126,73M
296815 73,22116,22126,2566M
296816 73,22123,22126,2566M
296824 73,22121,22126,2566M
296840 73,22116,22126,2566M
296843 73,22116,22126,2566M
296844 73,22116,22126,2566M
296849 73,22116,22126,2566M
296850 73,22116,22126,2566M
296854 73,22116,22126,2566M
296855 73,22116,22126,2566M
296856 73,22116,22126,2566M
296859 73,22116,22126,2566M
296863 73,22116,22126,2566M
296865 73,22116,22126,2566M
296866 73,22116,22126,2566M
296867 73,22116,22126,2566M
296870 73,22116,22126,2566M
296871 73,22116,22126,2566M
296874 73,22116,22126,2566M
296877 73,22116,22126,2566M
296878 73,22116,22126,2566M
296879 73,22116,22126,2566M
296884 73,22123,22126,2566M
296885 73,22123,22126,2566M
296887 6648,22123,22126,2566M
296889 73,22116,22126,2566M
296891 73,22116,22126,2566M
296896 73,22116,22126,2566M
296898 73,22116,22126,2566M
296901 73,22116,22126,2566M
296902 73,22116,22126,2566M
296903 73,22123,22126,2566M
296907 73,22123,22126,2566M
296910 73,22122,22126,2566M
296915 73,22117,22126,2566M
296916 73,22116,22126,2566M
296918 73,22116,22126,2566M
296920 73,22116,22126,2566M
296921 73,22116,22126,2566M
296922 73,22116,22126,2566M
296923 73,22116,22126,2566M
296924 73,22116,22126,2566M
296925 73,22116,22126,2566M
296926 73,22116,22126,2566M
296930 73,22118,22126,2566M