我有三张桌子:
语言
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
,而只能访问LangAbbr
表中的Languages
(到目前为止)在此查询中未使用。)
我的问题是,如何更新此查询以执行以下操作:
从ID
= X(Languages
= X的LangAbbr
表中获取String
变量)
使用该ID,返回一个数组,其键与Strings
表中每个Translation
的名称相等,其值等于
Translations
表中.js
表示该字符串/语言ID。
答案 0 :(得分:1)
您真的只需要通过Strings
向Languages
添加另一个联接,因为您没有要求为给定语言返回未翻译的字符串,所以没有什么复杂的。要将所有西班牙字符串作为String,Translation
对返回示例,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。可以构造fetch循环以将数组键设置为:
// 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'];
}