SELECT 
  tmall_products_categories.product_id, 
  GROUP_CONCAT(
    IF(
      tmall_products_categories.link_type = "M", 
      CONCAT(
        tmall_products_categories.category_id, 
        "M"
      ), 
      tmall_products_categories.category_id
    )
  ) AS category_ids 
FROM 
  tmall_products_categories 
  INNER JOIN tmall_categories ON tmall_categories.category_id = tmall_products_categories.category_id 
  AND tmall_categories.storefront_id IN (0, 1) 
  AND (
    tmall_categories.usergroup_ids = '' 
    OR FIND_IN_SET(
      0, tmall_categories.usergroup_ids
    ) 
    OR FIND_IN_SET(
      1, tmall_categories.usergroup_ids
    )
  ) 
  AND tmall_categories.status IN ('A', 'H') 
WHERE 
  tmall_products_categories.product_id IN (
    12, 17, 148, 180, 187, 232, 230, 231, 18, 
    16, 4, 5, 23, 24, 170, 1, 22, 149, 227, 
    78
  ) 
GROUP BY 
  tmall_products_categories.product_id

Query time 0.00778

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost": 0.084924511,
    "nested_loop": [
      {
        "table": {
          "table_name": "tmall_products_categories",
          "access_type": "range",
          "possible_keys": ["PRIMARY", "pt"],
          "key": "pt",
          "key_length": "3",
          "used_key_parts": ["product_id"],
          "loops": 1,
          "rows": 20,
          "cost": 0.037351962,
          "filtered": 100,
          "index_condition": "tmall_products_categories.product_id in (12,17,148,180,187,232,230,231,18,16,4,5,23,24,170,1,22,149,227,78)"
        }
      },
      {
        "table": {
          "table_name": "tmall_categories",
          "access_type": "eq_ref",
          "possible_keys": ["PRIMARY", "c_status", "p_category_id"],
          "key": "PRIMARY",
          "key_length": "3",
          "used_key_parts": ["category_id"],
          "ref": ["tmall.tmall_products_categories.category_id"],
          "loops": 20,
          "rows": 1,
          "cost": 0.03478532,
          "filtered": 100,
          "attached_condition": "tmall_categories.storefront_id in (0,1) and (tmall_categories.usergroup_ids = '' or find_in_set(0,tmall_categories.usergroup_ids) or find_in_set(1,tmall_categories.usergroup_ids)) and tmall_categories.`status` in ('A','H')"
        }
      }
    ]
  }
}

Result

product_id category_ids
1 190M
4 190M
5 191M
12 224M
16 194M
17 222M
18 194M
22 195M
23 195M
24 195M
78 226M
148 179M
149 179M
170 212M
180 200M
187 214M
227 170M
230 216M
231 216M
232 216M