2013-04-23 53 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