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 (
    601, 602, 603, 604, 607, 608, 801, 800, 
    799, 798, 797, 806, 805, 804, 803, 802, 
    810, 809, 808, 807, 814, 813, 823, 822, 
    965, 966, 1013, 1014
  ) 
GROUP BY 
  cscart_products_categories.product_id

Query time 0.00097

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "108.13"
    },
    "grouping_operation": {
      "using_temporary_table": true,
      "using_filesort": true,
      "cost_info": {
        "sort_cost": "4.04"
      },
      "nested_loop": [
        {
          "table": {
            "table_name": "cscart_categories",
            "access_type": "ALL",
            "possible_keys": [
              "PRIMARY",
              "c_status",
              "p_category_id"
            ],
            "rows_examined_per_scan": 125,
            "rows_produced_per_join": 5,
            "filtered": "4.00",
            "cost_info": {
              "read_cost": "29.49",
              "eval_cost": "1.00",
              "prefix_cost": "30.49",
              "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": "6.74",
            "index_condition": "(`cscart`.`cscart_products_categories`.`product_id` in (601,602,603,604,607,608,801,800,799,798,797,806,805,804,803,802,810,809,808,807,814,813,823,822,965,966,1013,1014))",
            "cost_info": {
              "read_cost": "61.60",
              "eval_cost": "0.81",
              "prefix_cost": "104.09",
              "data_read_per_join": "64"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        }
      ]
    }
  }
}

Result

product_id category_ids
601 305M,329,303
602 305M,329,303
603 303,305M,329
604 303,305M,329
607 343,335,333M
608 343,335,333M
797 393,392,396M
798 396M,393,392
799 396M,393,392
800 396M,393,392
801 396M,393,392
802 392,396M,393
803 393,392,396M
804 396M,393,392
805 396M,393,392
806 396M,393,392
807 396M,393,392
808 392,396M,393
809 393,392,396M
810 393,392,396M
813 397M,394,392
814 397M,394,392
822 398M,395,392
823 398M,395,392
965 344M,335,333
966 333,344M,335
1013 356M,309,345
1014 345,356M,309