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 (
    702, 701, 700, 699, 776, 775, 774, 780, 
    779, 778, 777, 784, 783, 782, 781, 787, 
    786, 785, 791, 790, 789, 788, 795, 794, 
    793, 792
  ) 
GROUP BY 
  cscart_products_categories.product_id

Query time 0.00118

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "107.79"
    },
    "grouping_operation": {
      "using_temporary_table": true,
      "using_filesort": true,
      "cost_info": {
        "sort_cost": "3.65"
      },
      "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": 3,
            "filtered": "6.08",
            "index_condition": "(`cscart`.`cscart_products_categories`.`product_id` in (702,701,700,699,776,775,774,780,779,778,777,784,783,782,781,787,786,785,791,790,789,788,795,794,793,792))",
            "cost_info": {
              "read_cost": "61.65",
              "eval_cost": "0.73",
              "prefix_cost": "104.14",
              "data_read_per_join": "58"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        }
      ]
    }
  }
}

Result

product_id category_ids
699 404,405M,298
700 404,405M,298
701 298,404,405M
702 404,405M,298
774 404,405M,298
775 404,405M,298
776 404,405M,298
777 404,405M,298
778 298,404,405M
779 404,405M,298
780 404,405M,298
781 404,405M,298
782 404,405M,298
783 404,405M,298
784 298,404,405M
785 298,299,391M
786 299,391M,298
787 299,391M,298
788 299,391M,298
789 299,391M,298
790 299,391M,298
791 298,299,391M
792 391M,298,299
793 299,391M,298
794 299,391M,298
795 299,391M,298