2012-11-21 90 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