4

我在 MySQL 中有以下语言表来选择不同语言的文本。

CREATE TABLE `lang` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`group` INT(10) UNSIGNED NOT NULL,
`text` VARCHAR(255) NULL DEFAULT NULL,
`language` VARCHAR(10) NOT NULL DEFAULT 'def',
PRIMARY KEY (`id`),
UNIQUE INDEX `group_language` (`group`, `language`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT

该表包含以下数据

id  group  text               language
1   1      This is English    def
2   2      Helo sir           def
3   3      how are you?       def
4   3      Wie geht es dir?   de

组字段告诉我哪些文本属于每个翻译。在上面的示例中,组 '3' 具有默认文本(英语)和德语翻译。

现在我想为德语选择所有文本,如果它们不存在,我会想要备用英文文本。

有人知道我如何将它们组合成一个 SQL 语句吗?

4

3 回答 3

3
SELECT  DISTINCT
        COALESCE(b.ID, a.ID) ID,
        COALESCE(b.`GROUP`, a.`GROUP`) `GROUP`,
        COALESCE(b.`text`, a.`text`) `text`,
        COALESCE(b.language, a.language) language
FROM   TableName a
       LEFT JOIN
        (
            SELECT ID, `GROUP`, `text`, language
            FROM tableName
            WHERE language = 'de'
         ) b ON a.ID <> b.ID AND a.`GROUP` = b.`GROUP`
于 2012-11-21T02:47:45.850 回答
2

以下查询将对其自身执行 lang 表的 LEFT JOIN,其中第一组列将保存与默认语言相对应的值,第二组保存de语言的值(如果存在),否则为空。如果存在,您将选择de.text,否则使用默认语言文本,使用标准ISNULL功能。

SELECT IFNULL(de.text, def.text) 
FROM
    lang def
    LEFT JOIN lang de
    ON def.group = de.group AND def.language = 'def' AND de.language = 'de'
于 2012-11-21T02:28:54.937 回答
0

是的,它似乎以这种方式工作。感谢 Vikdor 提供 JOIN:

SELECT
    def.id,
    def.`group`,
    IFNULL(curr.`text`, def.`text`) AS `text`
FROM
    lang def
LEFT JOIN
    lang curr
ON
    def.`group` = curr.`group` AND
    def.`language` = 'def' AND
    curr.`language` = 'de'
GROUP BY
    def.`group`
于 2012-11-21T02:49:35.300 回答