Mysql与回退语言的左连接或条件

Mysql与回退语言的左连接或条件,mysql,left-join,coalesce,fallback,Mysql,Left Join,Coalesce,Fallback,我有两张桌子“国家”和“国家/地区” +------+--------------+-----------------+ | id | region_code | sub_region_code | +------+--------------+-----------------+ | 1 | 142 | 034 | | 2 | 150 | 154 | | 3 | 002

我有两张桌子“国家”和“国家/地区”

+------+--------------+-----------------+
| 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是回退语言,因此我的目标是加入国家/地区,如果不在表中,则传递一个lnagage返回回退语言值

例如:

所选语言为de_de

我试过:

从国家/地区中选择*作为c 左连接 选择pid, 合并 从lang\u代码为'de\u de'且pid=c.id的国家/地区选择lang\u名称 , 从lang\u代码为'en\u GB'且pid=c.id的国家/地区选择lang\u名称 作为cl_的名字, 合并 从lang_代码为'de_de'且pid=c.id的国家/地区选择lang_capital , 从lang\u代码为'en\u GB'且pid=c.id的国家/地区选择lang\u capital 作为cl_资本 来自中国 AS cl 在c.id=cl.pid上 但返回c.id未知列

有什么建议吗?有两天我在做测试来解决这个问题

谢谢大家

编辑

我也尝试过这种方法,但总是返回回退语言值

从国家/地区中选择*作为c 左连接 选择pid、lang_名称、lang_代码来自lang_代码为'de_de'且lang_代码不为空或lang_代码为'en_GB'的国家/地区 如图所示 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\u lang=$\u会话['en\u GB'];或任何其他 $lang=$_会话['de_de'];或任何其他->从选择中获取

以及上述代码的更改

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

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

COALESCE获取第一个不为NULL的值,因此在所选值之前比回退之前


干杯

不清楚如何连接两个表,也不清楚为什么预期输出显示为英语,而实际上已经有一个条目。您如何定义哪个是回退?嗨,我不明白为什么连接不清楚,剪切中间部分从国家选择*作为c左连接从国家选择pid作为c上的cl。id=cl。pid@AivanMonceller在这个示例中,通过选择一个SELECT会话作为一个常量DEEDE,我的问题是如何获得一个EngGB作为回退语言的值,如果选择DEEDEHI感谢您的回复。我不认为模式不明确,我的目标是明确加入第二个表,如果所选语言de_de的值为空,则显示默认语言en_GB。顺便问一下,在您的代码中,您通过了默认语言en_GB?您好,我很好地检查了您的代码,您的解决方案在性能方面更好地结合了;
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)