Reputation: 324730
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?
Upvotes: 3
Views: 69
Reputation: 125925
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
Upvotes: 1