我有三个表:
语言
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
来自Languages
表其LangAbbr
= X(我的 变量)使用该 ID,返回一个数组,其键等于每个
String
的名称在Strings
表,其值等于Translation
在Translations
该字符串/语言 ID 的表。
最佳答案
您实际上只需要通过 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。获取循环可以构造为将数组键设置为:
// 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'];
}
关于mysql - SQL : Help writing select query using JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41403572/