2013-04-23 71 views
1

我需要本地化我的查询结果。要做到这一点,我有:MySql文本本地化

  • 该表Show,与id和一些其他信息;
  • ShowNameidShownamelang(每个显示有多个showName S其中Show.id = ShowName.idShow

我的查询现在是,并且能够正常运行:

select Show.*, 
(SELECT name FROM ShowName 
    WHERE Show.id=ShowName.idShow 
    ORDER BY FIELD(lang,'$userPreferredLanguage','en','it','es','fr','de','pt','da','he','pl','nl','hu','no','sl', 'fi','sv','tr','cs','hr', 'el','ru','zh','ja','ko') 
    LIMIT 0,1) as name, 
from Show 

现在,问题是:有没有办法加快一点点?查询大约需要3秒,其中2个用于计算内部SELECT。我尝试了INNER JOIN,但我无法弄清楚如何省略第二个选择。 PS:请注意,ShowName可能没有所有的本地化,所以我需要使用FIELD函数而不是简单的WHERE lang = '$userPreferredLanguage'

Thaks提前!

+0

你介意加入你的表结构? 'ORDER BY FIELD'可能是这个需要这么长时间的一个原因。我明白,你可能没有翻译所有语言的所有单词,但是如果你没有丹麦语可用,显示韩语真的有意义吗?通常你有你的默认语言,例如英语,如果您没有使用所需语言的术语,则可以使用英语。 – 2013-04-23 22:28:29

回答

0

你有一个索引ShowName(idShow)

这将有所帮助。一个更好的索引应该是:ShowName(IdShow, name, lang),因为子索引中的所有列引用都可以被索引满足。

它一旦你的指数也可能会更快做一个明确的加盟:

select Show.*, 
     (SELECT name 
     FROM ShowName join 
      (select 'en' as lang, 1 as priority union all 
       select 'it', 2 union all 
       . . . 
      ) lp 
      on showname.lang = lp.lang 
     WHERE Show.id=ShowName.idShow 
     ORDER BY lp.priority 
     LIMIT 0, 1 
     ) as name 
from Show 
+0

该查询工作,但没有速度改善:( – Spotlight 2013-04-24 14:47:49