mysql - 我可以使用自联接来获取此表吗

标签 mysql sql self-join

我有以下格式的一些数据:

国家:

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

最佳答案

此查询将为您提供所需的结果。它使用自连接,但仅连接到表中具有 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

关于mysql - 我可以使用自联接来获取此表吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58125254/

相关文章:

php - Mysql:多个自连接?

MySQL SELECT 特定年份的月份

mysql - 插入已排序的 SQL 条目

PHP 嵌套循环行为异常

SQL - 比较表中的行以查找列差异 - 自连接

sql-server - 在非键列上自联接

php - PDO插入语句未执行

mysql - 将 SQL "Concat"转换为 Activerecord

3 个表的 SQL 查询(或连接)

PHP 和 MYSQL - 查询变量