mysql - SQL : Help writing select query using JOIN

标签 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来自 Languages表其 LangAbbr = X(我的 变量)

  2. 使用该 ID,返回一个数组,其键等于每个 String 的名称在Strings表,其值等于 TranslationTranslations该字符串/语言 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/

相关文章:

php - 检查字符串是否包含数据库中的单词的函数

php - 在mysql查询ORDER BY中更改时间格式

php - 将时间范围合并到一个时间范围php

mysql - 分割值,以逗号分隔

mysql - 是否可以构造一个查询来匹配两个表强制执行 1 :1 relationship between them?

C++向MySQL插入数据返回错误

mysql - 从列中选择最大值并从另一列中选择相应的值

mysql - 使用 Angular 访问数据库

php - 仅按列的特定值分组

php - Sphinx_Query 失败 : no enabled local indexes to search