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 
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') 
WHERE 
  q_products_categories.product_id IN (
    29666, 29667, 29668, 29669, 29670, 29671, 
    29672, 29673, 29674, 29675, 29676, 
    29677, 29678, 29679, 29680, 29681
  ) 
GROUP BY 
  q_products_categories.product_id

Query time 0.00082

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "143.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": 49,
            "rows_produced_per_join": 49,
            "filtered": "100.00",
            "index_condition": "(`portal`.`q_products_categories`.`product_id` in (29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681))",
            "cost_info": {
              "read_cost": "74.81",
              "eval_cost": "9.80",
              "prefix_cost": "84.61",
              "data_read_per_join": "784"
            },
            "used_columns": [
              "product_id",
              "category_id",
              "link_type"
            ]
          }
        },
        {
          "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": 9,
            "filtered": "20.00",
            "cost_info": {
              "read_cost": "49.00",
              "eval_cost": "1.96",
              "prefix_cost": "143.41",
              "data_read_per_join": "25K"
            },
            "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
29666 545M
29667 401M
29668 154M
29669 383M
29670 189M
29671 195M
29672 204M
29673 385M
29674 401M
29675 261M
29676 545M
29677 402M
29678 195M
29679 401M
29680 443M
29681 378M