Mysql 左后备语言的连接或条件

Mysql left join with or condition for fallback language

我有 2 个 table 'countries' 和 'countries_lang'

+------+--------------+-----------------+
| id   | region_code  | sub_region_code |
+------+--------------+-----------------+
|    1 | 142          | 034             |
|    2 | 150          | 154             |
|    3 | 002          | 015             |
+------+--------------+-----------------+

+-----+--------------+---------------+--------------+
| id  | pid  | lang_code | lang_name | lang_capital |
+-----+------------------+-----------+--------------+
|   1 | 1    | en_GB     |Canada     | Ottawa       |
|   2 | 1    | de_DE     |Kanada     | Ottawa       |
|   3 | 2    | en_GB     |Italy      | Rome         |
+-----+------+-----------+-----------+--------------+

en_GB 是备用语言所以我的目标是加入 countries_lang 如果不在 table return 备用语言值

中传递语言

示例:

选择的语言是de_DE

+------+--------------+-----------------+--------------+
| id   | region_code  | lang_name       | lang_capital |
+------+--------------+-----------------+--------------+
|    1 | 142          | Kanada          | Ottawa       +
|    3 | 150          | Italy           | Rome         + (fallback language)
+------+--------------+-----------------+--------------+

我试过了:

    Select * FROM countries AS c 
     LEFT JOIN ( 
        SELECT pid, 
            COALESCE(
                (
                    SELECT lang_name FROM countries_lang WHERE lang_code = 'de_DE' AND pid = c.id
                ),
                (
                    SELECT lang_name FROM countries_lang WHERE lang_code = 'en_GB' AND pid = c.id

                )
            ) AS cl_name,
            COALESCE(
                (
                    SELECT lang_capital FROM countries_lang WHERE lang_code = 'de_DE' AND pid = c.id
                ),
                (
                    SELECT lang_capital FROM countries_lang WHERE lang_code = 'en_GB' AND pid = c.id

                )
            ) AS cl_capital
        FROM countries_lang
    ) AS cl 

    ON (c.id = cl.pid) 

但 return c.id 未知列

有什么建议吗?我正在测试解决这个问题的时间是 2 天

感谢大家!!!

编辑

我也尝试过这种方式,但return 总是后备语言值

    Select * FROM countries AS c
    LEFT JOIN ( 
        SELECT pid, lang_name, lang_code FROM countries_lang WHERE lang_code = 'de_DE' AND lang_code IS NOT NULL OR lang_code = 'en_GB'
    ) AS cl ON 
    c.id = cl.pid

我对您的架构逻辑以及您要查询的内容知之甚少。这是我根据您提供的信息可以得出的结论。让我知道进展如何。

查询:

select cl.id, c.region_code, cl.lang_name, cl.lang_capital
from countries_lang cl 
join countries c on c.id = cl.pid
left join 
(select cl.id, cl.pid
from countries_lang cl 
join countries c on c.id = cl.pid and cl.lang_code = 'de_DE') fcl on cl.pid = fcl.pid 
where cl.id = fcl.id or fcl.id is null

结果:

+------+--------------+-----------------+--------------+
| id   | region_code  | lang_name       | lang_capital |
+------+--------------+-----------------+--------------+
|    2 | 142          | Kanada          | Ottawa       +
|    3 | 150          | Italy           | Rome         + 
+------+--------------+-----------------+--------------+

确定找到解决方案,希望对某人有所帮助!

SELECT * FROM countries AS c
LEFT JOIN ( 
    SELECT jc.id, countries_lang.pid, countries_lang.lang_code,

    COALESCE(
        (
            SELECT lang_name FROM countries_lang 
            WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'de_DE'

        ),
        (
            SELECT lang_name FROM countries_lang 
            WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'en_GB'

        )
    ) AS coal_lang_name,

    COALESCE(
        (
            SELECT lang_capital FROM countries_lang 
            WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'de_DE'

        ),
        (
            SELECT lang_capital FROM countries_lang 
            WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'en_GB'

        )
    ) AS coal_lang_capital

    FROM countries_lang

    join countries jc on jc.id = countries_lang.pid
) AS cl ON 
(c.id = cl.pid)

要应用于所有语言,只需设置 2 个会话变量,一个用于 fallback_language,一个用于 selected 语言

示例

$fallback_lang = $_SESSION['en_GB'];或任何其他人 $lang = $_SESSION['de_DE'];或任何其他 -> 从 select

并更改上面的代码

第一次合并 其中 countries_lang.pid = jc.id 和 countries_lang.lang_code = '$lang'

第二次合并 其中 countries_lang.pid = jc.id 和 countries_lang.lang_code = '$fallback_lang'

COALESCE 在 selected 之前得到第一个非 NULL 的值而不是后备。

干杯!!