2012-11-21 66 views
4

我在MySQL中有以下语言表来选择不同语言的文本。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
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` 
+0

对我来说很可靠:-) – lockdoc

+0

我认为这段代码更好: SELECT 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 FROM tableName b ON b.language ='de'and a.language ='def'AND a.'GROUP' = b.'GROUP' –

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' 
+0

感谢您的快速回复。正如我从MySQL文档中看到的,'ISNULL'只有一个参数: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_isnull 所以这不起作用:-( – lockdoc

+0

然而,它确实可以和IFNULL一起工作,感谢JOIN的例子,现在我已经设法让它起作用并且会发布答案 – lockdoc

+0

Ah!ISNULL是SQL Server在MySQL中与IFNULL的对应部分感谢评论,我更新了答案,@ lockdoc。 – Vikdor

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

这是错误的。该ID与原始记录不匹配[点击此处](http://sqlfiddle.com/#!2/2157b/14) –

+0

你是对的,谢谢你指出这一点。 – lockdoc