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 = 168 
WHERE 
  q_products_categories.product_id IN (
    31047, 31053, 31068, 31074, 31082, 31089, 
    31091, 31117, 31129, 31151, 31155, 
    31156, 10422, 10429, 10431, 10432, 
    10433, 10027, 10028, 4579, 4580, 3352, 
    3353
  ) 
GROUP BY 
  q_products_categories.product_id

Query time 0.00084

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "133.21"
    },
    "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": 29,
            "rows_produced_per_join": 29,
            "filtered": "100.00",
            "index_condition": "(`portal`.`q_products_categories`.`product_id` in (31047,31053,31068,31074,31082,31089,31091,31117,31129,31151,31155,31156,10422,10429,10431,10432,10433,10027,10028,4579,4580,3352,3353))",
            "cost_info": {
              "read_cost": "57.81",
              "eval_cost": "5.80",
              "prefix_cost": "63.61",
              "data_read_per_join": "464"
            },
            "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": 29,
            "filtered": "100.00",
            "cost_info": {
              "read_cost": "29.00",
              "eval_cost": "5.80",
              "prefix_cost": "98.41",
              "data_read_per_join": "464"
            },
            "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": 5,
            "filtered": "20.00",
            "cost_info": {
              "read_cost": "29.00",
              "eval_cost": "1.16",
              "prefix_cost": "133.21",
              "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
3352 180M
3353 180M
4579 180M
4580 180M
10027 168M 0
10028 180M
10422 168M 0
10429 244M
10431 244M
10432 518M
10433 180M
31047 183M
31053 172,481,169M
31068 183M
31074 183M
31082 183M
31089 183M
31091 179M
31117 183M
31129 529M
31151 176M
31155 180M
31156 188M