2015-05-06 41 views
0

我試圖在我的數據庫中進行某種本地化。MySQL簡單本地化

例如,我有3個表格(圖1)。語言表包含不同的語言。本地化表有3個字段:「id」 - 字符串的id,'language' - 字符串的語言(id和language是我的主鍵),'value' - 本地化的字符串。 tableOne具有'id','Col1'和'Col2' - 這些字段包含可本地化字符串的ID。

所以在本地化後,我希望得到一個綠色的表格而不是原來的(取決於語言參數)。

我已經做到了這一點,它的工作原理,但我想知道是否有其他更好的方法來做到這一點,因爲現在我必須創建INNER JOIN塊,每個列必須進行本地化。我只是害怕它會非常緩慢。 我試着創建一個臨時表來選擇所需語言的所有記錄,然後我也這樣做了。內部連接,但只能在一種語言的記錄中執行搜索。但它不工作,因爲我仍然不得不使用多個內部聯接與臨時表,這是不可能的。

SELECT 
    `One`.`id` AS 'id', 
    `loc1`.`value` AS 'Col1', 
    `loc2`.`value` AS 'Col2' 
FROM 
    `tableOne` AS `One` 
     INNER JOIN 
      `localization` AS `loc1` 
     ON `loc1`.`id` = `One.Col1` 
     AND `loc1`.`language` = 'en' 

     INNER JOIN 
      `localization` AS `loc2` 
     ON `loc2`.`id` = `One.Col2` 
     AND `loc2`.`language` = 'en' 

enter image description here 圖1

+0

我覺得這個問題非常廣泛,也可以基於意見(因爲人們對於如何處理這個問題可能有不同的看法)。你有特定的問題嗎?你說你有什麼工作,所以我不確定你在問什麼。 – AdamMc331

+0

@ McAdam331,我想避免多個內部聯接,至少能夠使用此解決方案(內部聯接,但搜索應該只在一種語言的記錄之間執行。但它不工作,因爲我仍然不得不使用多個內部聯接與臨時表,這是不可能的)。或者,也許還有一些方法可以通過匹配表'localization'中的值來替換'tableOne'的值。 – FiftyStars

+0

是的,您需要加入需要本地化的每一列。您很可能會看到將languages.id(和localization.language)更改爲INT的效果會更好,如果您需要這些2個字符的語言代碼,請將它們作爲語言表中的單獨字段保留。 – Uueerdo

回答

1

如果您想要減少需要的JOINS的數量,請嘗試按行顯示值而不是列。你可以這樣做是這樣的:

SET @lang := 'en'; 

SELECT 1, tmp.value 
FROM(
    SELECT value 
    FROM localization 
    WHERE language = @lang AND id IN(543, 345)) tmp; 

我首先設置一個語言參數,然後我把所有值從定位表中的語言,使用IN操作符內的ID。你會得到的結果是這樣的:

| 1 | one | 
| 1 | two | 

如果你必須使用在第一個表中給出的格式,嘗試做一個內部聯接,你拉的特定語言和IDS是這樣的:

SELECT t1.id, t1.col1, t1.col2, 
    CASE WHEN l.id = t1.col1 THEN l.value ELSE null END AS col1Value, 
    CASE WHEN l.id = t1.col2 THEN l.value ELSE null END AS col2Value 
FROM firstTable t1 
JOIN localization l ON l.id IN (t1.col1, t1.col2) AND l.language = @lang; 

不幸的是,這不會給你最終的解決方案,它會給你喜歡的值:

| 1 | 543 | 345 | one | null | 
| 1 | 543 | 345 | null | two | 

爲了總結這些成一列,並刪除空值,只需添加MAX()

這將運行你有每列一個case語句,但只會有一個連接,看起來更易於管理:

SELECT t1.id, 
    MAX(CASE WHEN l.id = t1.col1 THEN l.value ELSE null END) AS col1Value, 
    MAX(CASE WHEN l.id = t1.col2 THEN l.value ELSE null END) AS col2Value 
FROM firstTable t1 
JOIN localization l ON l.id IN (t1.col1, t1.col2) AND l.language = @lang 
GROUP BY t1.id; 

下面是一個例子SQL Fiddle。我不認爲這些大小寫會讓你感到厭煩,但是讓我知道這是如何對你的實際數據庫進行預處理的。

+0

是的,這工作正常,但我添加了GROUP BY t1.id bcuz有多個值不正確的結果。謝謝你浪費我的時間。真的有幫助。很多 – FiftyStars

+0

@FiftyStars你是對的,我很抱歉,我忘了。在我的例子中,我只使用了一個ID,所以我沒有意識到這是一個問題。我將編輯答案。 – AdamMc331

-2

我不知道你有多少條記錄在每個表。如果他們是一個相對較小的數字,你可能會更好地找到一種方法,讓他們在記憶中而不是每次查詢。

+0

它應該是全站點的全球本地化系統。將有至少5種語言和至少1000個值(開始時)來本地化(小事情和大文本)。所以它不是一個解決方案 – FiftyStars