2013-04-23 3 views
1

Мне нужно локализовать результат моего запроса. Для этого у меня есть:Локализация текста MySql

  • таблица Show с id и некоторой другой информации;
  • таблица ShowName с idShow, name, lang (для каждого шоу есть несколько 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 

Теперь, возникает вопрос: есть ли способ немного ускорить работу? Запрос as принимает около 3 секунд, из которых 2 из них используются для вычисления внутреннего SELECT. Я пробовал с INNER JOIN, но я не мог понять, как опустить второй выбор. PS: обратите внимание, что ShowName может не иметь всех локализаций, поэтому мне нужно использовать функцию FIELD вместо простого WHERE lang = '$userPreferredLanguage'.

Thaks заранее!

+0

Вы возражали бы добавить свои структуры таблицы? «ORDER BY FIELD» может быть одной из причин, почему это занимает так много времени. Я понимаю, что у вас может не быть перевода для всех слов на всех языках, но действительно ли имеет смысл отображать корейский язык, когда у вас нет датского языка? Обычно у вас есть язык по умолчанию, например. английский, на который вы можете вернуться, если у вас нет термина на запрошенном языке. –

ответ

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

Смежные вопросы