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 (
    30896, 30897, 30898, 30899, 30900, 30901, 
    30902, 30903, 30904, 30905, 30906, 
    30907, 30908, 30909, 30910, 30911, 
    30912, 30913, 30914, 30915, 30916, 
    30917, 30918, 30919, 30920, 30921, 
    30922, 30923, 30924, 30925, 30926, 
    30927
  ) 
GROUP BY 
  q_products_categories.product_id

Query time 0.00123

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "133.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": 39,
            "rows_produced_per_join": 39,
            "filtered": "100.00",
            "index_condition": "(`portal`.`q_products_categories`.`product_id` in (30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927))",
            "cost_info": {
              "read_cost": "78.81",
              "eval_cost": "7.80",
              "prefix_cost": "86.61",
              "data_read_per_join": "624"
            },
            "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": 7,
            "filtered": "20.00",
            "cost_info": {
              "read_cost": "39.00",
              "eval_cost": "1.56",
              "prefix_cost": "133.41",
              "data_read_per_join": "20K"
            },
            "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
30896 454M
30897 584M
30898 189M
30899 183M
30900 378M
30901 445M
30902 378M
30903 64M
30904 371M
30905 597M
30906 184M
30907 478M
30908 136M
30909 44M
30910 184M
30911 183M
30912 160M
30913 255M
30914 564M
30915 364M
30916 189M
30917 187M
30918 473M
30919 95M
30920 183M
30921 160M
30922 91M
30923 167,596M
30924 446M
30925 432M
30926 6M
30927 547,478M