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)