SELECT 
  cscart_products_categories.product_id, 
  GROUP_CONCAT(
    IF(
      cscart_products_categories.link_type = "M", 
      CONCAT(
        cscart_products_categories.category_id, 
        "M"
      ), 
      cscart_products_categories.category_id
    )
  ) AS category_ids 
FROM 
  cscart_products_categories 
  INNER JOIN cscart_categories ON cscart_categories.category_id = cscart_products_categories.category_id 
  AND cscart_categories.storefront_id IN (0, 1) 
  AND (
    cscart_categories.usergroup_ids = '' 
    OR FIND_IN_SET(
      0, cscart_categories.usergroup_ids
    ) 
    OR FIND_IN_SET(
      1, cscart_categories.usergroup_ids
    )
  ) 
  AND cscart_categories.status IN ('A', 'H') 
WHERE 
  cscart_products_categories.product_id IN (
    565, 564, 567, 566, 592, 593, 831, 830, 
    829, 828, 827, 835, 834, 846, 845, 844, 
    843, 842, 851, 850, 849, 848, 847, 863, 
    862, 861, 860, 859, 972, 973, 974, 975
  ) 
GROUP BY 
  cscart_products_categories.product_id

Query time 0.00098

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "110.13"
    },
    "grouping_operation": {
      "using_temporary_table": true,
      "using_filesort": true,
      "cost_info": {
        "sort_cost": "4.41"
      },
      "nested_loop": [
        {
          "table": {
            "table_name": "cscart_categories",
            "access_type": "ALL",
            "possible_keys": [
              "PRIMARY",
              "c_status",
              "p_category_id"
            ],
            "rows_examined_per_scan": 126,
            "rows_produced_per_join": 5,
            "filtered": "4.00",
            "cost_info": {
              "read_cost": "29.72",
              "eval_cost": "1.01",
              "prefix_cost": "30.73",
              "data_read_per_join": "20K"
            },
            "used_columns": [
              "category_id",
              "storefront_id",
              "usergroup_ids",
              "status"
            ],
            "attached_condition": "((`cscart`.`cscart_categories`.`storefront_id` in (0,1)) and ((`cscart`.`cscart_categories`.`usergroup_ids` = '') or find_in_set(0,`cscart`.`cscart_categories`.`usergroup_ids`) or find_in_set(1,`cscart`.`cscart_categories`.`usergroup_ids`)) and (`cscart`.`cscart_categories`.`status` in ('A','H')))"
          }
        },
        {
          "table": {
            "table_name": "cscart_products_categories",
            "access_type": "ref",
            "possible_keys": [
              "PRIMARY",
              "pt"
            ],
            "key": "PRIMARY",
            "used_key_parts": [
              "category_id"
            ],
            "key_length": "3",
            "ref": [
              "cscart.cscart_categories.category_id"
            ],
            "rows_examined_per_scan": 12,
            "rows_produced_per_join": 4,
            "filtered": "7.29",
            "index_condition": "(`cscart`.`cscart_products_categories`.`product_id` in (565,564,567,566,592,593,831,830,829,828,827,835,834,846,845,844,843,842,851,850,849,848,847,863,862,861,860,859,972,973,974,975))",
            "cost_info": {
              "read_cost": "62.90",
              "eval_cost": "0.88",
              "prefix_cost": "105.72",
              "data_read_per_join": "70"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        }
      ]
    }
  }
}

Result

product_id category_ids
564 389,300M
565 300M,389
566 389,300M
567 389,300M
592 366,374,301M
593 366,374,301M
827 302,367M,301
828 301,302,367M
829 301,302,367M
830 301,302,367M
831 367M,301,302
834 373M,301,372
835 372,373M,301
842 302,368M,301
843 301,302,368M
844 301,302,368M
845 368M,301,302
846 368M,301,302
847 368M,301,302
848 302,368M,301
849 301,302,368M
850 301,302,368M
851 301,302,368M
859 369M,301,302
860 369M,301,302
861 369M,301,302
862 301,302,369M
863 301,302,369M
972 309,350M,310
973 309,350M,310
974 310,309,350M
975 310,309,350M