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