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 (
    2913, 2914, 2915, 2916, 2917, 2918, 2919, 
    2920, 2921, 2881, 2882, 2883, 2884, 
    2885, 2886, 2887, 2888, 2889, 2890, 
    2891, 2892, 2858, 2859, 2860, 2861, 
    2862, 2863, 2864, 2865, 2866
  ) 
GROUP BY 
  q_products_categories.product_id

Query time 0.00089

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "144.01"
    },
    "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": 30,
            "rows_produced_per_join": 30,
            "filtered": "100.00",
            "index_condition": "(`portal`.`q_products_categories`.`product_id` in (2913,2914,2915,2916,2917,2918,2919,2920,2921,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2858,2859,2860,2861,2862,2863,2864,2865,2866))",
            "cost_info": {
              "read_cost": "66.01",
              "eval_cost": "6.00",
              "prefix_cost": "72.01",
              "data_read_per_join": "480"
            },
            "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": 30,
            "filtered": "100.00",
            "cost_info": {
              "read_cost": "30.00",
              "eval_cost": "6.00",
              "prefix_cost": "108.01",
              "data_read_per_join": "480"
            },
            "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": "30.00",
              "eval_cost": "1.20",
              "prefix_cost": "144.01",
              "data_read_per_join": "15K"
            },
            "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
2858 4M
2859 4M
2860 4M
2861 4M
2862 4M
2863 5M
2864 4M
2865 4M
2866 4M
2881 39M
2882 39M
2883 4M
2884 4M
2885 4M
2886 4M
2887 4M
2888 4M
2889 4M
2890 5M
2891 39M
2892 5M
2913 5M
2914 39M
2915 4M
2916 5M
2917 4M
2918 4M
2919 5M
2920 4M
2921 5M