SELECT 
  q_products_categories.product_id, 
  GROUP_CONCAT(
    IF(
      q_products_categories.link_type = "M", 
      CONCAT(
        q_products_categories.category_id, 
        "M"
      ), 
      q_products_categories.category_id
    )
  ) AS category_ids, 
  product_position_source.position AS position 
FROM 
  q_products_categories 
  INNER JOIN q_categories ON q_categories.category_id = q_products_categories.category_id 
  AND (
    q_categories.usergroup_ids = '' 
    OR FIND_IN_SET(0, q_categories.usergroup_ids) 
    OR FIND_IN_SET(1, q_categories.usergroup_ids)
  ) 
  AND q_categories.status IN ('A', 'H') 
  LEFT JOIN q_products_categories AS product_position_source ON q_products_categories.product_id = product_position_source.product_id 
  AND product_position_source.category_id = 3 
WHERE 
  q_products_categories.product_id IN (
    35664, 35665, 35666, 35667, 35668, 35669, 
    35670, 35671, 35672, 35673, 35674, 
    35675, 35676, 35677, 35678, 35679, 
    35680, 35681, 35682, 35683, 35684, 
    35685, 35686, 35687, 35688, 35689, 
    35690, 35691, 35692, 35693, 35694, 
    35695
  ) 
GROUP BY 
  q_products_categories.product_id

Query time 0.00090

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "157.41"
    },
    "grouping_operation": {
      "using_filesort": false,
      "nested_loop": [
        {
          "table": {
            "table_name": "q_products_categories",
            "access_type": "range",
            "possible_keys": [
              "PRIMARY",
              "pt"
            ],
            "key": "pt",
            "used_key_parts": [
              "product_id"
            ],
            "key_length": "3",
            "rows_examined_per_scan": 33,
            "rows_produced_per_join": 33,
            "filtered": "100.00",
            "index_condition": "(`portal`.`q_products_categories`.`product_id` in (35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695))",
            "cost_info": {
              "read_cost": "71.61",
              "eval_cost": "6.60",
              "prefix_cost": "78.21",
              "data_read_per_join": "528"
            },
            "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",
              "portal.q_products_categories.product_id"
            ],
            "rows_examined_per_scan": 1,
            "rows_produced_per_join": 33,
            "filtered": "100.00",
            "cost_info": {
              "read_cost": "33.00",
              "eval_cost": "6.60",
              "prefix_cost": "117.81",
              "data_read_per_join": "528"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "position"
            ]
          }
        },
        {
          "table": {
            "table_name": "q_categories",
            "access_type": "eq_ref",
            "possible_keys": [
              "PRIMARY",
              "c_status",
              "p_category_id"
            ],
            "key": "PRIMARY",
            "used_key_parts": [
              "category_id"
            ],
            "key_length": "3",
            "ref": [
              "portal.q_products_categories.category_id"
            ],
            "rows_examined_per_scan": 1,
            "rows_produced_per_join": 6,
            "filtered": "20.00",
            "cost_info": {
              "read_cost": "33.00",
              "eval_cost": "1.32",
              "prefix_cost": "157.41",
              "data_read_per_join": "17K"
            },
            "used_columns": [
              "category_id",
              "usergroup_ids",
              "status"
            ],
            "attached_condition": "(((`portal`.`q_categories`.`usergroup_ids` = '') or find_in_set(0,`portal`.`q_categories`.`usergroup_ids`) or find_in_set(1,`portal`.`q_categories`.`usergroup_ids`)) and (`portal`.`q_categories`.`status` in ('A','H')))"
          }
        }
      ]
    }
  }
}

Result

product_id category_ids position
35664 39M
35665 39M
35666 39M
35667 39M
35668 39M
35669 39M
35670 39M
35671 39M
35672 39M
35673 39M
35674 39M
35675 39M
35676 39M
35677 39M
35678 39M
35679 39M
35680 39M
35681 39M
35682 39M
35683 39M
35684 39M
35685 39M
35686 39M
35687 39M
35688 39M
35689 39M
35690 39M
35691 39M
35692 39M
35693 39M
35694 39M
35695 39M