SQL:帮助使用JOIN编写选择查询

时间:2016-12-30 22:37:45

标签: mysql

我有三张桌子:

语言

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(到目前为止)在此查询中未使用。)

我的问题是,如何更新此查询以执行以下操作:

  1. ID = X(Languages = X的LangAbbr表中获取String 变量)

  2. 使用该ID,返回一个数组,其键与Strings表中每个Translation的名称相等,其值等于 Translations表中.js表示该字符串/语言ID。

1 个答案:

答案 0 :(得分:1)

您真的只需要通过StringsLanguages添加另一个联接,因为您没有要求为给定语言返回未翻译的字符串,所以没有什么复杂的。要将所有西班牙字符串作为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'];
}