【问题标题】:Can I use self join to fetch this table我可以使用自连接来获取这个表吗
【发布时间】:2019-09-26 21:57:41
【问题描述】:

我有一些数据格式如下:

国家:

lang | code | name
==========================
EN     1001   Italy
IT     1001   Italia
RO     1001   Italia
AL     1001   Itali
TR     1001   Italya
--------------------------
EN     1002   Greece
RO     1002   Grecia
AL     1002   Greqi
TR     1002   Yunanistan
--------------------------
EN     1003   Romania
AL     1003   Rumani
TR     1003   Romanya
--------------------------

我想选择所有名称,但要多一列,在其中我以特定语言(例如 EN)列出该国家/地区的名称(具有相同的代码)。

我想打印这张表:

lang | code | name        | name_EN
===================================
EN     1001   Italy         Italy
IT     1001   Italia        Italy
RO     1001   Italia        Italy
AL     1001   Itali         Italy
TR     1001   Italya        Italy
-----------------------------------
EN     1002   Greece        Greece
RO     1002   Grecia        Greece
AL     1002   Greqi         Greece
TR     1002   Yunanistan    Greece
-----------------------------------
EN     1003   Romania       Romania
AL     1003   Rumani        Romania
TR     1003   Romanya       Romania
-----------------------------------

我尝试使用自加入,但没有成功。

SELECT t1.lang AS lang
    , t1.code  AS code
    , t1.name  AS name
    , t2.name  AS name_EN
FROM countries t1
INNER JOIN countries t2 
    ON t2.name = t1.name
    AND t2.lang = 'EN'

从这个查询中,我只得到了 lang EN 中的名称;每个国家/地区 1 个名称。

lang | code | name        | name_EN
===================================
 EN    1001   Italy         Italy
 EN    1002   Greece        Greece
 EN    1003   Romania       Romania

如果我删除t2.lang = 'EN' 条件,新列与现有名称列相同。

  1. 我真的可以使用自联接获得这种表吗?如果是,怎么做?

  2. 如果这不能通过自联接完成,是否值得(在性能方面)尝试在 MySql 中进行,还是我最好以编程方式进行?

你可以在这里测试它。 https://paiza.io/projects/e/oahtrlObx_ctyHBZFnzDvA

【问题讨论】:

    标签: mysql sql self-join


    【解决方案1】:

    此查询将为您提供所需的结果。它使用自连接,但仅适用于表中具有lang=EN 的值,并且它连接到code,因此无论当前语言如何,我们都可以获取英文名称:

    SELECT t1.lang, t1.code, t1.name,
           t2.name AS name_EN
    FROM countries t1
    JOIN countries t2 ON t2.lang = 'EN' AND t1.code = t2.code
    

    输出:

    lang    code    name        name_EN
    EN      1001    Italy       Italy
    IT      1001    Italia      Italy
    RO      1001    Italia      Italy
    AL      1001    Itali       Italy
    TR      1001    Italya      Italy
    EN      1002    Greece      Greece
    RO      1002    Grecia      Greece
    AL      1002    Greqi       Greece
    TR      1002    Yunanistan  Greece
    EN      1003    Romania     Romania
    AL      1003    Rumani      Romania
    TR      1003    Romanya     Romania
    

    Demo on dbfiddle

    【讨论】:

    • 还有一个问题:条件的顺序会影响性能吗(在一个大表中,大是 100k+ 行)
    • @jack 条件的顺序不应该有任何区别。对(语言,代码)进行索引应该会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2017-04-11
    • 2010-12-24
    相关资源
    最近更新 更多