2014-04-18 61 views
0

我有一個MySQL表像附加的圖像。加入與自己的MySQL表

Translation Table

[ID +區域]是我的表項。我將en_US的所有術語作爲我的語言環境,如果我有任何其他語言環境的翻譯,我將它們添加到具有相同標識但不同語言環境的表中。如果在另一個語言環境中沒有關於某個ID的記錄,這意味着我們仍然沒有翻譯它。

我的例外結果也在Image中。要做到這一點我用這個SQL查詢:

 
    SELECT t1.id as id, 
     (SELECT t2.text 
     FROM translation t2 
     WHERE t2.id = t1.id 
     AND t2.locale= :locale 
     ) as translated, 
     t1.text as english 
    FROM translation t1 
    WHERE t1.locale = 'en_US' 
    AND t1.id= :id 

:ID:現場是我的變量參數)

我的問題:

  1. 我還是沒對它進行基準測試,但我的查詢對我來說效率不高。
  2. 我無法在查詢中搜索或排序翻譯的列。 (或者也許我不知道該怎麼做)
  3. 我試過左連接(和左外連接),但我似乎它不同的表現在MySQL

你知道有更好的SQL這樣做工作?或者如何對我的翻譯的列進行排序和搜索?

謝謝

回答

0

最好使用左聯接。您可以通過添加一個條件查詢的左側上搜索:

SELECT t1.id as id, 
    t1.text as english, 
    t2.text as translated 
FROM translation t1 
    LEFT JOIN translation t2 on t1.id = t2.id 
     and t2.locale = :locale 
WHERE t1.locale = 'en_US' 
ORDER BY translated 

這樣,你仍然可以獲得英語翻譯,即使沒有滿足您的翻譯「:語言環境」。

+0

工作正常。謝謝 – Shahram

+0

你很受歡迎。樂意效勞 :) –

0

Left JoinLeft Outer Join是相同的。關鍵字outer只是可選的。

嘗試使用下面的查詢:

SELECT  t1.id as id, 
      t1.Text as English, 
      t2.Text as Translated 
FROM  translation t1 
LEFT JOIN translation t2 ON t2.id = t1.id 
WHERE  t1.locale = 'en_US' 
AND   t2.locale = :locale 
AND   t1.id = :id 
+0

這看起來很有效率,但我不能得到我的翻譯的列的空值行 – Shahram

+0

我不關注 - 這個查詢會給你完全的。這些結果和你的期望有什麼不同? – Siyual