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 = 248 
WHERE 
  q_products_categories.product_id IN (
    1559, 1560, 1561, 1562, 1563, 1564, 1565, 
    1566, 1567, 1568, 1569, 1570, 1571, 
    1572, 1573, 1574, 1577, 1578, 1579, 
    1580, 1581, 1582, 1583, 1584, 1585, 
    1586, 1587, 1588, 1589, 1590, 1591, 
    1592
  ) 
GROUP BY 
  q_products_categories.product_id

Query time 0.00103

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 (1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592))",
            "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
1559 546M
1560 546M
1561 546M
1562 248M 0
1563 248M 0
1564 248M 0
1565 248M 0
1566 248M 0
1567 546M
1568 290M
1569 290M
1570 290M
1571 290M
1572 290M
1573 290M
1574 290M
1577 393M
1578 393M
1579 393M
1580 393M
1581 167,276M
1582 276M
1583 276M
1584 276M
1585 276M
1586 393M
1587 167,276M
1588 248M 0
1589 167,276M
1590 393M
1591 393M
1592 167,393M