Mysql 将查询简化为案例

Mysql 将查询简化为案例,mysql,union,Mysql,Union,以下是到目前为止的查询: select `formeid`, `name`, 'm' as `gender` from `data_pokemon` where `genders` not like '0|_' and `formeid` not in (select `formeid` from `dex` where `userid`=@userid and `gender`='m') union select `formeid`, `name`, 'f' as `g

以下是到目前为止的查询:

select `formeid`, `name`, 'm' as `gender` from `data_pokemon`
    where `genders` not like '0|_' and `formeid` not in
        (select `formeid` from `dex` where `userid`=@userid and `gender`='m')
union
select `formeid`, `name`, 'f' as `gender` from `data_pokemon`
    where `genders` not like '_|0' and `formeid` not in
        (select `formeid` from `dex` where `userid`=@userid and `gender`='f')
union
select `formeid`, `name`, 'n' as `gender` from `data_pokemon`
    where `genders`='0|0' and `formeid` not in
        (select `formeid` from `dex` where `userid`=@userid and `gender`='n')
order by `formeid`

正如你所看到的,有很多重复。有没有办法简化这个查询,这样就不会有太多事情发生?

我明白了。这在索引使用方面有多高效?@Kolink:
p.genders不像“\u124; 0”
是唯一一个不能使用索引的位,但它也存在于原始查询中;根据您的数据结构,您可能能够对其进行改进(例如,将
'f'
性别作为
CASE
表达式的
ELSE
子句),否则您必须将该列标准化。除此之外,
data\u pokemon.(genders,formeid)
dex.(userid,gender,formeid)
上的索引应该被证明非常有效。
SELECT   p.formeid, p.name,
         CASE
           WHEN p.genders NOT LIKE '0|_' THEN 'm'
           WHEN p.genders NOT LIKE '_|0' THEN 'f'
           WHEN p.genders =        '0|0' THEN 'n'
         END AS gender
FROM     data_pokemon p LEFT JOIN dex d
      ON p.formeid = d.formeid
     AND d.userid  = @userid
     AND d.gender  = CASE
           WHEN p.genders NOT LIKE '0|_' THEN 'm'
           WHEN p.genders NOT LIKE '_|0' THEN 'f'
           WHEN p.genders =        '0|0' THEN 'n'
         END
WHERE    d.formeid IS NULL
ORDER BY p.formeid