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 的值而不是后备。
干杯!!
我有 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 的值而不是后备。
干杯!!