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, 969, 
    970, 972, 973, 974, 975
  ) 
GROUP BY 
  cscart_products_categories.product_id

Query time 0.00092

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "109.70"
    },
    "grouping_operation": {
      "using_temporary_table": true,
      "using_filesort": true,
      "cost_info": {
        "sort_cost": "3.97"
      },
      "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": 3,
            "filtered": "6.57",
            "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,969,970,972,973,974,975))",
            "cost_info": {
              "read_cost": "62.90",
              "eval_cost": "0.79",
              "prefix_cost": "105.72",
              "data_read_per_join": "63"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        }
      ]
    }
  }
}

Result

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