【发布时间】:2012-05-28 10:44:20
【问题描述】:
这是一个非常微妙的问题,但我会尽力说清楚:
我有一个表 countrynames 有 3 列:iso、lang、name。
这些的主要拼写是英文,例如:
+-----+------+-----------------------------+
| iso | lang | name |
+-----+------+-----------------------------+
| CA | EN | Canada |
| CC | EN | Cocos (Keeling) Islands |
| CF | EN | Central African Republic |
| CG | EN | Congo |
| CI | EN | Cote d'ivoire (Ivory Coast) |
| CK | EN | Cook Islands |
| CL | EN | Chile |
| CM | EN | Cameroon |
| CN | EN | China |
| CO | EN | Colombia |
+-----+------+-----------------------------+
iso 是引用国家 iso-3166 编码的外键。
我插入了一些具有英语拼写的国家,但也只有当拼写与英语不同时才插入其他语言,以节省数据库中的一些空间(例如德语中的“Germany”是“Deutschland”,所以'DE' 的 iso 在表中出现两次,有 2 个不同的名称)。
我需要的是选择某种特定语言(如德语或西班牙语)的所有国家/地区,然后从同一列中选择所有具有英文名称的国家/地区。如果外文没有对应的名字,那么英文名字应该填空,这样我就得到了英文+外文的混合。混合应等于具有英语拼写的国家/地区的总和,如下所示(空值是英文名称应填充缺失的西班牙名称的位置,例如刚果、智利、中国、哥伦比亚):
'CA', 'ES', 'Canadá'
'CC', 'ES', 'Islas Cocos'
'CD', 'ES', 'República Democrática del Congo'
'CF', 'ES', 'República Centroafricana'
NULL, NULL, NULL
'CH', 'ES', 'Suiza'
'CI', 'ES', 'Costa del Marfil'
'CK', 'ES', 'Islas Cook'
NULL, NULL, NULL
'CM', 'ES', 'Camerún'
NULL, NULL, NULL
NULL, NULL, NULL
NULL, NULL, NULL
NULL, NULL, NULL
这是我目前使用的:
select result2.iso, result2.lang, result2.name from (select result1.* from (select t1.*
from (
select iso, lang, name from countrynames where lang = 'es') t1
right join
(select iso, lang, name from countrynames where lang = 'en') t2
on t1.iso = t2.iso) result1) result2;
【问题讨论】:
标签: mysql select union left-join outer-join