Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simplifying a query into cases

Tags:

mysql

union

Here's the query as it stands so far:

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`

As you can see, there's a lot of repetition. Is there any way to simplify this query so there isn't so much going on?

like image 628
Niet the Dark Absol Avatar asked Jul 23 '26 16:07

Niet the Dark Absol


1 Answers

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
like image 112
eggyal Avatar answered Jul 25 '26 07:07

eggyal



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!