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 を実行します。列の最初のセットにはデフォルト言語に対応する値が保持され、2 番目のセットにはde言語の値が存在する場合はその値が保持され、それ以外の場合は null が保持されます。標準機能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

うん、こんな感じで使えそうです。JOIN を提供してくれた Vikdor に感謝します。

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 に答える