我是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
答案 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,而不是回退。
干杯!!