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 (
    1016, 1017, 622, 638, 639, 980, 981, 982, 
    983, 984, 997, 998, 999, 1000, 1001, 
    1002, 1003, 1004, 1005, 1006, 1007, 
    1008, 1009, 1010, 1011, 1030, 621, 1029
  ) 
GROUP BY 
  cscart_products_categories.product_id

Query time 0.00128

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "109.65"
    },
    "grouping_operation": {
      "using_temporary_table": true,
      "using_filesort": true,
      "cost_info": {
        "sort_cost": "3.93"
      },
      "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.49",
            "index_condition": "(`cscart`.`cscart_products_categories`.`product_id` in (1016,1017,622,638,639,980,981,982,983,984,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1030,621,1029))",
            "cost_info": {
              "read_cost": "62.90",
              "eval_cost": "0.79",
              "prefix_cost": "105.72",
              "data_read_per_join": "62"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        }
      ]
    }
  }
}

Result

product_id category_ids
621 355,311M
622 311,355,309M
638 309M,363,365
639 309M,363,365
980 309,363,364M
981 364M,309,363
982 363,364M,309
983 363,364M,309
984 363,364M,309
997 365M,309,363
998 365M,309,363
999 365M,309,363
1000 363,365M,309
1001 363,365M,309
1002 363,365M,309
1003 309,363,365M
1004 365M,309,363
1005 365M,309,363
1006 363,365M,309
1007 363,365M,309
1008 363,365M,309
1009 309,363,365M
1010 365M,309,363
1011 365M,309,363
1016 357M,309,345
1017 357M,309,345
1029 311M,355
1030 355,311,309M