【问题标题】:Retrieve columns from the same table with the same foreign keys but different values从同一个表中检索具有相同外键但值不同的列
【发布时间】: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


    【解决方案1】:

    你原来的SELECT可以简化一点:

    SELECT t1.iso, t1.lang, t1.name
      FROM (SELECT * FROM countrynames WHERE lang = 'ES') t1
      RIGHT JOIN (SELECT * FROM countrynames WHERE lang = 'EN') t2
      ON t1.iso = t2.iso;
    

    然后您需要做的就是合并列结果,因此如果t1 中没有值,则检索t2 值:

    SELECT COALESCE(t1.iso, t2.iso), COALESCE(t1.lang, t2.lang), COALESCE(t1.name, t2.name)
      FROM (SELECT * FROM countrynames WHERE lang = 'ES') t1
      RIGHT JOIN (SELECT * FROM countrynames WHERE lang = 'EN') t2
      ON t1.iso = t2.iso;
    

    【讨论】:

    • 非常感谢!解决方案有时很容易找到,以至于我们忘记了寻找复杂方法来实现目标的事情:)
    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 2019-05-31
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多