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, 638, 639, 980, 981, 982, 983, 
    984, 990, 991, 992, 993, 994, 995, 996, 
    997, 998, 999, 1000, 1001, 1002, 1003, 
    1004, 1005, 1006, 1007, 1008, 1009, 
    1010, 1011
  ) 
GROUP BY 
  cscart_products_categories.product_id

Query time 0.00107

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "108.42"
    },
    "grouping_operation": {
      "using_temporary_table": true,
      "using_filesort": true,
      "cost_info": {
        "sort_cost": "4.33"
      },
      "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": "7.22",
            "index_condition": "(`cscart`.`cscart_products_categories`.`product_id` in (1016,1017,638,639,980,981,982,983,984,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011))",
            "cost_info": {
              "read_cost": "61.60",
              "eval_cost": "0.87",
              "prefix_cost": "104.09",
              "data_read_per_join": "69"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        }
      ]
    }
  }
}

Result

product_id category_ids
638 365,309M,363
639 365,309M,363
980 363,364M,309
981 309,363,364M
982 309,363,364M
983 309,363,364M
984 309,363,364M
990 364M,309,363
991 364M,309,363
992 363,365M,309
993 309,363,365M
994 309,363,365M
995 365M,309,363
996 365M,309,363
997 365M,309,363
998 363,365M,309
999 309,363,365M
1000 309,363,365M
1001 365M,309,363
1002 365M,309,363
1003 365M,309,363
1004 363,365M,309
1005 309,363,365M
1006 309,363,365M
1007 365M,309,363
1008 365M,309,363
1009 365M,309,363
1010 365M,309,363
1011 363,365M,309
1016 309,345,357M
1017 309,345,357M