加入一个自己的MySQL表

时间:2014-04-18 18:41:15

标签: mysql sql join

我有一张类似附图的MySQL表。

Translation Table

[id + locale]是我的表键。我有所有的英语术语,en_US作为我的语言环境,如果我有任何其他语言环境的翻译,我将它们添加到具有相同ID但不同语言环境的表中。如果在另一个语言环境中没有id的记录,则意味着我们仍然没有翻译它。

我的例外结果也在图片中。为此,我使用了这个SQL查询:

    SELECT t1.id as id,
        (SELECT t2.text
        FROM translation t2
        WHERE t2.id = t1.id
        AND t2.locale= :locale
        ) as translated,
        t1.text as english
    FROM translation t1
    WHERE t1.locale = 'en_US'
    AND t1.id= :id

:id :locale 是我的变量参数)

我的问题:

  1. 我仍然没有对它进行基准测试,但我的查询对我来说效率不高。
  2. 我无法在查询中搜索已翻译的列。 (或者我可能不知道该怎么做)
  3. 我尝试了左连接(并且左外连接),但我似乎在MySQL上表现不同
  4. 你知道更好的SQL来完成这项工作吗?或者我如何对已翻译的专栏进行排序和搜索?

    谢谢

2 个答案:

答案 0 :(得分:0)

Left JoinLeft Outer Join是相同的。 outer关键字只是可选的。

尝试使用以下查询:

SELECT      t1.id as id,
            t1.Text as English,
            t2.Text as Translated
FROM        translation t1
LEFT JOIN   translation t2 ON t2.id = t1.id
WHERE       t1.locale = 'en_US'
AND         t2.locale = :locale
AND         t1.id = :id

答案 1 :(得分:0)

最好使用左连接。您可以通过在查询左侧添加条件来搜索:

SELECT t1.id as id,
    t1.text as english,
    t2.text as translated
FROM translation t1
    LEFT JOIN translation t2 on t1.id = t2.id
        and t2.locale = :locale
WHERE t1.locale = 'en_US'
ORDER BY translated

这样,即使没有符合您的':locale'的翻译,您仍然可以获得英文翻译。