2012-10-21 23 views
3

這裏的查詢,因爲它代表迄今:簡化查詢到案件

select `formeid`, `name`, 'm' as `gender` from `data_pokemon` 
    where `genders` not like '0|_' and `formeid` not in 
     (select `formeid` from `dex` where `userid`[email protected] 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`[email protected] 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`[email protected] and `gender`='n') 
order by `formeid` 

正如你可以看到,有很多重複的。有沒有什麼辦法來簡化這個查詢,所以沒有那麼多?

回答

1
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 
+0

我明白了。這在索引使用方面的效率如何? –

+1

@Kolink:'p.genders NOT LIKE'_ | 0''是唯一不能使用索引的位,但它也存在於原始查詢中;取決於你的數據結構,你可能可以改進它(例如把''f''性別作爲'CASE'表達式的ELSE'子句) - 否則你必須規範化該列。除此之外,'data_pokemon。(genders,formeid)'和'dex。(userid,gender,formeid)'的索引應該證明是非常有效的。 – eggyal