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.00107

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