SELECT 
  ushop_products_categories.product_id, 
  GROUP_CONCAT(
    IF(
      ushop_products_categories.link_type = "M", 
      CONCAT(
        ushop_products_categories.category_id, 
        "M"
      ), 
      ushop_products_categories.category_id
    )
  ) AS category_ids, 
  product_position_source.position AS position 
FROM 
  ushop_products_categories 
  INNER JOIN ushop_categories ON ushop_categories.category_id = ushop_products_categories.category_id 
  AND ushop_categories.storefront_id IN (0, 1) 
  AND (
    ushop_categories.usergroup_ids = '' 
    OR FIND_IN_SET(
      0, ushop_categories.usergroup_ids
    ) 
    OR FIND_IN_SET(
      1, ushop_categories.usergroup_ids
    )
  ) 
  AND ushop_categories.status IN ('A', 'H') 
  LEFT JOIN ushop_products_categories AS product_position_source ON ushop_products_categories.product_id = product_position_source.product_id 
  AND product_position_source.category_id = 316 
WHERE 
  ushop_products_categories.product_id IN (
    291, 299, 311, 361, 295, 325, 360, 312, 
    318, 315, 362, 296, 363, 548, 322
  ) 
GROUP BY 
  ushop_products_categories.product_id

Query time 0.00088

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "21.01"
    },
    "grouping_operation": {
      "using_filesort": false,
      "nested_loop": [
        {
          "table": {
            "table_name": "ushop_products_categories",
            "access_type": "range",
            "possible_keys": [
              "PRIMARY",
              "pt"
            ],
            "key": "pt",
            "used_key_parts": [
              "product_id"
            ],
            "key_length": "3",
            "rows_examined_per_scan": 15,
            "rows_produced_per_join": 15,
            "filtered": "100.00",
            "index_condition": "(`marketplace`.`ushop_products_categories`.`product_id` in (291,299,311,361,295,325,360,312,318,315,362,296,363,548,322))",
            "cost_info": {
              "read_cost": "9.01",
              "eval_cost": "1.50",
              "prefix_cost": "10.51",
              "data_read_per_join": "240"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        },
        {
          "table": {
            "table_name": "product_position_source",
            "access_type": "eq_ref",
            "possible_keys": [
              "PRIMARY",
              "pt"
            ],
            "key": "PRIMARY",
            "used_key_parts": [
              "category_id",
              "product_id"
            ],
            "key_length": "6",
            "ref": [
              "const",
              "marketplace.ushop_products_categories.product_id"
            ],
            "rows_examined_per_scan": 1,
            "rows_produced_per_join": 15,
            "filtered": "100.00",
            "cost_info": {
              "read_cost": "3.75",
              "eval_cost": "1.50",
              "prefix_cost": "15.76",
              "data_read_per_join": "240"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "position"
            ]
          }
        },
        {
          "table": {
            "table_name": "ushop_categories",
            "access_type": "eq_ref",
            "possible_keys": [
              "PRIMARY",
              "c_status",
              "p_category_id"
            ],
            "key": "PRIMARY",
            "used_key_parts": [
              "category_id"
            ],
            "key_length": "3",
            "ref": [
              "marketplace.ushop_products_categories.category_id"
            ],
            "rows_examined_per_scan": 1,
            "rows_produced_per_join": 0,
            "filtered": "5.00",
            "cost_info": {
              "read_cost": "3.75",
              "eval_cost": "0.08",
              "prefix_cost": "21.01",
              "data_read_per_join": "2K"
            },
            "used_columns": [
              "category_id",
              "storefront_id",
              "usergroup_ids",
              "status"
            ],
            "attached_condition": "((`marketplace`.`ushop_categories`.`storefront_id` in (0,1)) and ((`marketplace`.`ushop_categories`.`usergroup_ids` = '') or (0 <> find_in_set(0,`marketplace`.`ushop_categories`.`usergroup_ids`)) or (0 <> find_in_set(1,`marketplace`.`ushop_categories`.`usergroup_ids`))) and (`marketplace`.`ushop_categories`.`status` in ('A','H')))"
          }
        }
      ]
    }
  }
}

Result

product_id category_ids position
291 349M
295 349M
296 349M
299 349M
311 353M
312 353M
315 353M
318 353M
322 353M
325 353M
360 359M
361 359M
362 359M
363 359M
548 316M 0