2016-12-30 70 views
2

選擇查詢我有三個表:SQL:幫助編寫使用JOIN

語言

ID LangName LangAbbr 
1  English  en 
2  Spanish  es 

字符串

ID String 
1  Hello 
2  Goodbye 

翻譯

ID LangID StringID Translation 
1  1   1   Hello 
2  2   1   Hola 
3  1   2   Goodbye 
4  2   2   Adios 

截至目前,我已經從languages表語言的ID,跑一個查詢來獲取所有的翻譯是語言:

SELECT t.Translation, s.String FROM Strings 
AS s JOIN Translations AS t ON s.ID = t.StringID 
AND LangID = :LangID 

這個偉大的工程。但是,我需要在其他地方更新一些代碼,現在我不再能夠訪問LangID,而是僅從Languages表(至今未在此查詢中使用過)的LangAbbr

我的問題是,我該如何更新此查詢來執行以下操作:

  1. Languages表,其LangAbbr = X(我 變量)

  2. 獲取ID使用該ID ,返回一個數組,其鍵的值等於Strings表中每個String的名稱,其值等於該字符串的Translations表中的 Translation/l語言ID。

+0

因此,作爲一個SQL結果集,你找給對'es'爲'你好,HOLA |再見,Adios'? (格式化爲與您的應用程序代碼相關但與SQL相關的數組) –

+0

尋找array('String'=>'Translation')',就像語言是西班牙語'array('Hello'=> 'Hola')' – JROB

+0

Bur你正在尋找給定語言的_all_字符串翻譯,對嗎?不只是一個特定的翻譯? –

回答

1

你真的只需要增加通過Strings另一個加盟Languages因爲你沒有要求退回未翻譯的字符串對於給定的語言沒有什麼複雜的。要返回西班牙所有的字符串作爲String,Translation對用於exampel時,SQL會(http://sqlfiddle.com/#!9/30273/4):

SELECT 
    String, 
    Translation 
FROM 
    strings s 
    INNER JOIN translations t ON s.ID = t.StringID 
    INNER JOIN languages l ON t.LangID = l.ID 
-- use PDO param :langAbbr 
WHERE LangAbbr = 'es' 

基於您的評論,我會假設你使用PHP/PDO。在取環可以構造設置爲數組鍵:

// Assuming a successful prepare()/execute() of the above query 
// into $stmt 
$stmt = $conn->prepare($sql_from_above); 
$stmt->execute(array(':langAbbr' => 'es')); 

$translations = array(); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    // Index the $translations array by String during the fetch 
    $translations[$row['String']] = $row['Translation']; 
} 
+0

太棒了。謝謝。其中一天,我會遇到一篇文章,教導'JOIN'查詢點擊。我讀過很多,但他們都沒有真正打到家。再次感謝。 – JROB

+0

我通常認爲它是一個鏈,從你知道靜態('Strings')開始,並通過每個需要獲取所有需要的列作爲輸出並應用WHERE過濾器的表向後鏈接。有時,如果一個表實際上多次使用,鏈必須自行循環。不確定此圖像是否有助於或複雜化... –