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 (
    583, 573, 1040, 1072, 1022, 1023, 1054, 
    1053, 1070, 815, 811, 820, 819, 1100, 
    959, 952, 950, 951, 1079, 945, 953, 956, 
    947, 1106
  ) 
GROUP BY 
  cscart_products_categories.product_id

Query time 0.00121

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "107.11"
    },
    "grouping_operation": {
      "using_temporary_table": true,
      "using_filesort": true,
      "cost_info": {
        "sort_cost": "2.97"
      },
      "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": 2,
            "filtered": "4.95",
            "index_condition": "(`cscart`.`cscart_products_categories`.`product_id` in (583,573,1040,1072,1022,1023,1054,1053,1070,815,811,820,819,1100,959,952,950,951,1079,945,953,956,947,1106))",
            "cost_info": {
              "read_cost": "61.65",
              "eval_cost": "0.59",
              "prefix_cost": "104.14",
              "data_read_per_join": "47"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        }
      ]
    }
  }
}

Result

product_id category_ids
573 388,300M,403
583 403,388,300M
811 397M,392,394
815 416M,392,394
819 416M,392,394
820 394,416M,392
945 334,336M,333
947 334,337M,333
950 334,338M,333
951 334,338M,333
952 333,334,339M
953 333,334,339M
956 334,333,340M
959 340M,334,333
1022 309,347M,362
1023 309,361M,347
1040 421M
1053 430M
1054 431M
1070 430M
1072 421M
1079 342M
1100 304M
1106 363M