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 (
    749, 752, 751, 750, 748, 761, 760, 759, 
    770, 769, 768, 801, 800, 799, 798, 797, 
    806, 805, 804, 803, 802, 810, 809, 808, 
    807, 814, 813, 823, 822, 1013, 1014
  ) 
GROUP BY 
  cscart_products_categories.product_id

Query time 0.00120

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "110.18"
    },
    "grouping_operation": {
      "using_temporary_table": true,
      "using_filesort": true,
      "cost_info": {
        "sort_cost": "4.46"
      },
      "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.37",
            "index_condition": "(`cscart`.`cscart_products_categories`.`product_id` in (749,752,751,750,748,761,760,759,770,769,768,801,800,799,798,797,806,805,804,803,802,810,809,808,807,814,813,823,822,1013,1014))",
            "cost_info": {
              "read_cost": "62.90",
              "eval_cost": "0.89",
              "prefix_cost": "105.72",
              "data_read_per_join": "71"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        }
      ]
    }
  }
}

Result

product_id category_ids
748 375,377,382M
749 382M,375,377
750 382M,375,377
751 377,382M,375
752 375,377,382M
759 375,377,382M
760 375,377,382M
761 375,377,382M
768 381M,375,376
769 381M,375,376
770 375,376,381M
797 393,392,396M
798 396M,393,392
799 396M,393,392
800 392,396M,393
801 392,396M,393
802 392,396M,393
803 393,392,396M
804 396M,393,392
805 396M,393,392
806 396M,393,392
807 392,396M,393
808 392,396M,393
809 392,396M,393
810 393,392,396M
813 397M,394,392
814 397M,394,392
822 392,398M,395
823 392,398M,395
1013 345,309,356M
1014 345,309,356M