MySQL:从右表或默认值读取



我使用一个表来保存一些文本数据,其结构如下:

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(字符串_es),但在英语中存在(字符串_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查询中做到这一点。

您应该在字符串表中使用该语言,并使其成为唯一键(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。

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`
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

最新更新