MySQL按键选择行或回退以选择默认键

时间:2012-11-21 02:25:58

标签: mysql sql translation

我在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语句中吗?

3 个答案:

答案 0 :(得分: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`

答案 1 :(得分: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'

答案 2 :(得分: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`