MySQL:从右表或默认值中读取

时间:2012-01-25 16:21:49

标签: mysql internationalization

我使用表格来保存一些具有以下结构的 text 数据:

CREATE TABLE IF NOT EXISTS `strings_en` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
  `content` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

此表保留所有英语"字符串" (实际上这是一个有时比4kb长的文本)。当我需要一个字符串时,我就像这样调用mySQL:

SELECT `content` FROM `strings_en` WHERE `id`='42'

现在,我已经"国际化"我的应用程序所以我添加了其他名为" strings_es"或" strings_de"使用西班牙语和荷兰语的地方。每个id始终匹配不同语言的相同字符串。

在PHP中,我有一个包含当前所选语言的 $ language 变量:' es'对于西班牙语,' en'对于英语等,我得到一个包含此查询的字符串:

SELECT `content` FROM `strings_$language` WHERE `id`='$string'

问题是有时没有给定id的翻译(这个id不存在于表中)。例如,在西班牙语中,不存在id = 10(strings_es),但它存在于english(strings_en)中。我使用* strings_en *作为默认,所以当一个字符串不存在于当前语言中时,我会用英语搜索。现在我通过PHP条件执行此操作:

$result = query("SELECT `content` FROM `strings_$language` WHERE `id`='$string'");
if (empty($result)) {
    $result = query("SELECT `content` FROM `strings_en` WHERE `id`='$string'");
}

我想知道如何只在一个MySQL查询中执行此操作。

3 个答案:

答案 0 :(得分:1)

SELECT COALESCE(other, en)
FROM (
    SELECT (SELECT `content` FROM `strings_$language` WHERE id = `$string`) as other,
    (SELECT `content` FROM `strings_en` WHERE id = `$string`) as en
) a

答案 1 :(得分:1)

SELECT ISNULL(l.`content`, e.`content`) AS `content`
FROM `strings_en` AS e
LEFT OUTER JOIN `strings_$language` AS l ON l.`id` = e.`id`
WHERE e.`id` = `$string`

答案 2 :(得分:1)

您应该使用字符串表中的语言并将其作为唯一键(id + language)的一部分。这样,当您使用越来越多的语言时,您不必添加新表。

例如:

CREATE TABLE IF NOT EXISTS `strings` (
  `string_id` int(11) NOT NULL AUTO_INCREMENT,
  `id` int(11) NOT NULL ,
  `language` char(2) NOT NULL DEFAULT 'en',
  `title` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
  `content` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`string_id`) ,
  `i_id_lang`  UNIQUE INDEX (id,language)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

并且

( SELECT * FROM strings WHERE id=? AND language=? UNION 
  SELECT * FROM strings WHERE id=? AND language='en' ) LIMIT 1

您将获得给定语言或默认语言的ID字符串。

修改:我添加了一个string_id列作为唯一ID。