Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:从右表或默认表读取_Mysql_Internationalization - Fatal编程技术网

MySQL:从右表或默认表读取

MySQL:从右表或默认表读取,mysql,internationalization,Mysql,Internationalization,我正在使用一个表以这种结构保存一些文本数据: 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

我正在使用一个表以这种结构保存一些文本数据:

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),但英语中存在id=10(strings)。我使用*strings\u 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+语言)的一部分。这样,当您使用越来越多的语言时,就不必添加新表了

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
例如:

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\u id
列作为唯一id。

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

例如:

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\u id
列作为唯一id。

返回:#1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解第5行“a”附近使用的正确语法返回:#1064-您的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解第5行“a”附近使用的正确语法。这里的问题是“id”是主键,因此无法添加id为的新行。并且我无法删除主键,因为如果id重复,其他(外部)模块可能会收到错误。继承代码的常见问题:(@Ivan I添加了一个
string\u id
列作为strings表的唯一键,现在您可以根据需要使用
id
列。我知道。这里的问题是“id”是主键,因此无法添加具有该id的新行。我无法删除主键,因为还有其他主键(外部)如果id重复,则预期会收到错误的模块。继承代码的常见问题:(@Ivan I添加了一个
string_id
列作为strings表的唯一键,现在您可以根据需要使用
id
列。