Mysql离开连接或后退语言的条件

时间:2016-07-22 01:19:04

标签: mysql left-join coalesce fallback

我是stackoverflow的新手,希望以正确的方式发布我的问题。

我有2个表'country'和'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传递一个lnaguage如果不在表中返回后备语言值

示例:

所选语言为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) 

但返回c.id UNKNOWN列

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

感谢所有人!!!

修改

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

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

2 个答案:

答案 0 :(得分:1)

我对您的架构逻辑是什么以及您正在尝试查询的内容知之甚少。以下是我根据您提供的信息提出的建议。让我知道它是怎么回事。

查询:

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         + 
+------+--------------+-----------------+--------------+

答案 1 :(得分:1)

好的找到了解决方案并希望对某人有所帮助!

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)

要申请所有语言,只需要为fallback_language设置2个会话变量,为选定语言设置一个

示例

$ fallback_lang = $ _SESSION [' en_GB'];或任何其他人 $ lang = $ _SESSION [' de_DE'];或任何其他 - >从选择中获取

并更改上述代码

首先合并 国家/地区--lang.pid= jc.id AND countries_lang.lang_code =' $ lang'

第二次合并 country_lang.pid = jc.id AND countries_lang.lang_code =' $ fallback_lang'

COALESCE在选择之前得到的第一个值不是NULL,而不是回退。

干杯!!